[C#] Welke type erft van een base-class?

Pagina: 1
Acties:

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
Ik heb een baseclass A. Er zijn verschillende andere classes die erven van A en die classes zitten in verschillende assemblies in de GAC.

Nu scan ik door de GAC en wil elke assembly hebben die minstens een class bevat die erft van baseclassA.

Nu ben ik bezig te zoeken bij de Type class. Daar kan ik op dit moment niet een call vinden die mij makkelijk de class teruggeeft die erft van baseclass A.

Hebben jullie een idee?

code:
1
2
3
4
5
6
7
8
9
10
bool assemblyHasBaseClass = false;

foreach(Type type in types)
{
      if (type.IsClass && type.IsPublic && type.????)
   {
      assemblyHasBaseClass = true;
      break;
   }
}

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
dit werkt alleen bij direct afgeleiden

bij mij kan dit ook voorkomen:

baseclassA


class B : baseclassA

class C: class B

nu wil ik zowel B als C te pakken krijgen

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat is toch een kwestie van de 'tree' omhoog fietsen (al dan niet recursief) dan?
Sowieso zie ik het probleem dan niet zo, je hebt een node A waar je B onder hangt. Op het moment dat je C tegen komt hang je die onder B (precies zoals het ook in elkaar steekt). Dan is 'ie dus automatisch (grand)child van A; alleen geen direct child. En dat klopt, dat is 'ie ook niet. Als je B en C 'siblings' wil maken zie ik niet wat het nut ervan is om dat zo te doen; het komt namelijk niet overeen met je structuur.

[ Voor 72% gewijzigd door RobIII op 19-06-2008 13:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • EfBe
  • Registratie: Januari 2000
  • Niet online
1) assemblies niet in de GAC stoppen, MS adviseert alleen assemblies in de GAC te stoppen als dat echt noodzakelijk is, en dat is het bijna nooit.
2) IsAssignableFrom kun je gebruiken:
typeof(TypeToCompareWith).IsAssignableFrom(typeof(TypeToCheck))
dus in jouw geval:
if(typeof(A).IsAssignableFrom(type))
{
// type is a subtype of A
}

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
EfBe schreef op donderdag 19 juni 2008 @ 13:18:
1) assemblies niet in de GAC stoppen, MS adviseert alleen assemblies in de GAC te stoppen als dat echt noodzakelijk is, en dat is het bijna nooit.
2) IsAssignableFrom kun je gebruiken:
typeof(TypeToCompareWith).IsAssignableFrom(typeof(TypeToCheck))
dus in jouw geval:
if(typeof(A).IsAssignableFrom(type))
{
// type is a subtype of A
}
over punt 1) ik heb te maken met assemblies die vanuit Biztalk worden aangeroepen; BizTalk werkt alleen met assemblies in de GAC

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
RobIII schreef op donderdag 19 juni 2008 @ 13:14:
Dat is toch een kwestie van de 'tree' omhoog fietsen (al dan niet recursief) dan?
Sowieso zie ik het probleem dan niet zo, je hebt een node A waar je B onder hangt. Op het moment dat je C tegen komt hang je die onder B (precies zoals het ook in elkaar steekt). Dan is 'ie dus automatisch (grand)child van A; alleen geen direct child. En dat klopt, dat is 'ie ook niet. Als je B en C 'siblings' wil maken zie ik niet wat het nut ervan is om dat zo te doen; het komt namelijk niet overeen met je structuur.
de meeste classes zijn zoals class B, dus direct afgeleide van A, echter elk project kan van class A afleiden en ook daarbinnen weer afgeleiden maken. Ik wil alleen die assemblies hebben die op een of andere manier de baseclass A als root hebben

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DrDelete schreef op donderdag 19 juni 2008 @ 13:30:
[...]


de meeste classes zijn zoals class B, dus direct afgeleide van A, echter elk project kan van class A afleiden en ook daarbinnen weer afgeleiden maken. Ik wil alleen die assemblies hebben die op een of andere manier de baseclass A als root hebben
Of je EfBe's (imho overigens nettere) oplossing of de mijne nou gebruikt; als je die tree opbouwt weet je toch gewoon in no-time of C (uiteindelijk) van A afstamt? Ik zie heel het probleem niet :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
RobIII schreef op donderdag 19 juni 2008 @ 13:34:
[...]

Of je EfBe's (imho overigens nettere) oplossing of de mijne nou gebruikt; als je die tree opbouwt weet je toch gewoon in no-time of C (uiteindelijk) van A afstamt? Ik zie heel het probleem niet :?
houd er wel rekening mee dat ik alleen A ken, de overige classes B en C (slechts een voorbeeld) zijn classes die door andere teams gemaakt kunnen worden en op het systeem zijn geGACt.Ik kan met reflection alle assemblies + types scannen, daarin wil ik zien of ze ergens in hun objecttree (naar boven toe gezien) baseclass A erven.

[ Voor 12% gewijzigd door DrDelete op 19-06-2008 13:39 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DrDelete schreef op donderdag 19 juni 2008 @ 13:38:
houd er wel rekening mee dat ik alleen A ken, de overige classes B en C (slechts een voorbeeld) zijn classes die door andere teams gemaakt kunnen worden
Boeie wie ze maakt; daar heb je toch juist reflection voor :?
DrDelete schreef op donderdag 19 juni 2008 @ 13:38:
Ik kan met reflection alle assemblies + types scannen
...en dus een tree opbouwen of per type EfBe's oplossing toepassen
DrDelete schreef op donderdag 19 juni 2008 @ 13:38:
daarin wil ik zien of ze ergens in hun objecttree (naar boven toe gezien) baseclass A erven.
...en waar zit het probleem dan :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
RobIII schreef op donderdag 19 juni 2008 @ 13:41:
[...]

Boeie wie ze maakt; daar heb je toch juist reflection voor :?


[...]

...en dus een tree opbouwen of per type EfBe's oplossing toepassen


[...]

...en waar zit het probleem dan :?
indien ik assignablefrom probeer, dan krijg ik alle assemblies terug die classes bevatten en niet alleen die van class A erven.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
DrDelete schreef op donderdag 19 juni 2008 @ 13:54:
[...]


indien ik assignablefrom probeer, dan krijg ik alle assemblies terug die classes bevatten en niet alleen die van class A erven.
huh? Nee natuurlijk niet, je filtert op assemblies waar types in zitten waar AssignableFrom true voor returnt. Dus dat werkt gewoon.

Overigens kan het wel even duren voordat je alle assemblies hebt gehad, werk dus met een filter op .net framework assemblies die kun je gewoon ignoren.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
EfBe schreef op donderdag 19 juni 2008 @ 20:37:
[...]

huh? Nee natuurlijk niet, je filtert op assemblies waar types in zitten waar AssignableFrom true voor returnt. Dus dat werkt gewoon.

Overigens kan het wel even duren voordat je alle assemblies hebt gehad, werk dus met een filter op .net framework assemblies die kun je gewoon ignoren.
Ik heb het nu aan de praat. Ik had een foutje gemaakt in het verkrijgen van de assembly type, maar nu werkt het. :z

Het ophalen duurt behoorlijk lang. Ik moet een manier zien te verzinnen om de performance op te schroeven. Hoe had je deze filter in gedachten trouwens?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Alle assemblies met namen die beginnen met: "System", "mscorlib", "System.", "Microsoft." of zo heten, kun je overslaan. Dat scheelt al een heleboel. Nog steeds zal het veel tijd kosten hoor, dus je moet echt iets verzinnen waarbij je snel de assemblies kunt selecteren. Bv, doordat de assemblies gesigned zijn met een public key token dat je opgeeft in de config file (de public key token geef je dan op in de config file en die vergelijk je dan met de token in een assembly's strong name).

Onze dependency injection engine doet toch wel een paar seconden over het afsjouwen van alle types in de assemblies in een applicatie uitgezonderd de assemblies van MS, dus alle assemblies in de gac doen kost wel even wat langer.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 21:14
EfBe schreef op donderdag 19 juni 2008 @ 21:42:
Alle assemblies met namen die beginnen met: "System", "mscorlib", "System.", "Microsoft." of zo heten, kun je overslaan. Dat scheelt al een heleboel. Nog steeds zal het veel tijd kosten hoor, dus je moet echt iets verzinnen waarbij je snel de assemblies kunt selecteren. Bv, doordat de assemblies gesigned zijn met een public key token dat je opgeeft in de config file (de public key token geef je dan op in de config file en die vergelijk je dan met de token in een assembly's strong name).

Onze dependency injection engine doet toch wel een paar seconden over het afsjouwen van alle types in de assemblies in een applicatie uitgezonderd de assemblies van MS, dus alle assemblies in de gac doen kost wel even wat langer.
ik heb het volgende gedaan om performance te realiseren:
- ik heb een assembly name filter toegevoegd, deze is te zetten in de applicatie config file, indien deze leeg wordt gelaten, worden alle assemblies gescand.
- ik cache het eerste resultaat en heb een refresh list button toegevoegd om de lijst opnieuw te laten opbouwen
Pagina: 1