2017-08-31 7 views
1

Ich versuche die Mechanismen der Reflektion zu verstehen. Ich möchte die Eigenschaft eines Objekts mit einem bestimmten Wert vergleichen. Jetzt, anstatt den Vergleich auszuführen und eine Ausnahme abzufangen, möchte ich (natürlich zur Laufzeit) wissen können, ob die beiden Objekte vergleichbar sind.C# zur Laufzeit prüfen ob zwei Objekte vergleichbar sind

Etwas wie:

public bool IsComparableWithProperty(string propertyName, object value) 
{ 
    return typeof(MyType).GetProperty(propertyName).PropertyType is IComparable<value.GetType()>   
} 

Natürlich weiß ich, dass dies nicht gilt als Generika zum Zeitpunkt der Kompilierung bekannt sein müssen. Ich habe mich gefragt, ob diese Art von Verhalten in C# implementiert werden könnte.

Dank

Antwort

3

können Sie MakeGenericType verwenden, um die generische Schnittstellendefinition mit dem Wert Laufzeittyp und IsAssignableFrom Kompatibilität überprüfen verwenden zu instanziiert.

public bool IsComparableWithProperty(string propertyName, object value) 
{ 
    return typeof(IComparable<>).MakeGenericType(value.GetType()).IsAssignableFrom(typeof(MyType).GetProperty(propertyName).PropertyType); 
} 
+0

Ist es möglich, dass ich andere Ergebnisse bekommen könnte, wenn ich es umgekehrt mache? Könnte das jemals falsch sein? "typeof (IComparable <>). MakeGenericType (o1.GetType()). IsAssignableFrom (o2.GetType()) == typeof (IComparable <>). MakeGenericType (o2.GetType()). IsAssignableFrom (o1.GetType()).)) ' – AFusco

+0

Ich bin mir nicht sicher, dass der Vergleich viel Sinn macht .. Sie vergleichen 'T2 ist ICoamparable ' zu 'T1 ist IComparable ' ... –

+0

Für den Ausdruck in der Methode, True zurückgeben, würde der Eigenschaftstyp haben Ich bin etwas, das 'IComparable ' implementiert –

Verwandte Themen