Prüfen von Eigenschaften per Reflection auf Typ mit generischem Parameter

07/07/2008 - 10:12 von Kai Bräutigam | Report spam
Hallo NG,

ich habe folgende Klasse:

public class ElementListBase<T> : List<T> where T : ElementBase

In einer weiteren Klasse möchte ich nun prüfen, ob eine Egenschaft dieser
Klasse von oben genannten Typ ElementListBase existiert.

In etwa sollte das also so ausschauen:
foreach (PropertyInfo pInfo in this.GetType().GetProperties())
{
if (pInfo.PropertyType.IsSubclassOf(typeof(ElementListBase)))
{
...
}
}

Das geht so natürlich nicht, da ElementListBase noch einen generischen Typ
als Parameter erwartet. Allerdings bringt mich ein Aufruf von
typeof(ElementListBase<ElementBase>)) auch nicht weiter, da ElementBase die
Basisklasse darstellt und ich daher nicht nach dieser, sondern nach allen
davon abgeleiteten Klassen suche.

Hat hierzu jemand eine Idee, wie ich dir Prüfung richtig formuliere? Ist
womöglich eine ganz simple Sache (hoffe ich), aber ich komm irgendwie nicht
drauf...

Danke im Vorraus,
Kai
 

Lesen sie die antworten

#1 Elmar Boye
07/07/2008 - 18:11 | Warnen spam
Hallo Kai,

Kai Bràutigam schrieb:
public class ElementListBase<T> : List<T> where T : ElementBase

In einer weiteren Klasse möchte ich nun prüfen, ob eine Egenschaft
dieser Klasse von oben genannten Typ ElementListBase existiert.



Die Aussage ist mir nicht ganz verstàndlich.
Meinst Du Eigenschaft von ElementBase oder von ElementListBase?

In etwa sollte das also so ausschauen:
foreach (PropertyInfo pInfo in this.GetType().GetProperties())
{
if (pInfo.PropertyType.IsSubclassOf(typeof(ElementListBase)))
{
...
}
}

Das geht so natürlich nicht, da ElementListBase noch einen generischen Typ
als Parameter erwartet. Allerdings bringt mich ein Aufruf von
typeof(ElementListBase<ElementBase>)) auch nicht weiter, da ElementBase die
Basisklasse darstellt und ich daher nicht nach dieser, sondern nach allen
davon abgeleiteten Klassen suche.



Um an den Typ von ElementListBase oder auch die konkrete Implementation
von ElementBase zu gelangen, mußt Du Dich rekursiv durch die Typdefinitionen
raufarbeiten.

Das könnte folgt aussehen:
public static PropertyInfo GetProperty(Type listType, string propertyName)
{
Type elementType = null;
Type baseType = listType;
while (baseType != null)
{
if (baseType.IsGenericType && typeof(ElementListBase<>)
== baseType.GetGenericTypeDefinition())
{
Type[] genericArguments = baseType.GetGenericArguments();
// Type von ElementBase
elementType = genericArguments[0];

break;
}
baseType = baseType.BaseType;
}

if (baseType != null)
{
PropertyInfo[] properties = baseType.GetProperties();

// Case Sensitiv
foreach (PropertyInfo pi in properties)
{
if (pi.Name.Equals(propertyName))
return pi;
}

// 2. Versuch: Case Insensitiv
foreach (PropertyInfo pi in properties)
{
if (pi.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase))
return pi;
}
}
return null;
}

Ich habe dort auch den Abruf des Elementtypes eingebaut,
für den Fall das Du den suchst.

Gruß Elmar

Ähnliche fragen