2017-08-31 4 views
1

J'essaie de comprendre les mécanismes de la réflexion. Je souhaite comparer la propriété d'un objet avec une valeur donnée. Maintenant, au lieu d'exécuter la comparaison et d'attraper une exception, je veux être capable de savoir (bien sûr à l'exécution) si les deux objets sont comparables.C# vérifier à l'exécution si deux objets sont comparables

Quelque chose comme:

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

Bien sûr, je sais que ce n'est pas valide en tant que médicaments génériques doivent être connus au moment de la compilation. Je me demandais si ce genre de comportement pourrait être implémenté en C#.

Merci

Répondre

3

Vous pouvez utiliser MakeGenericType instancier la définition d'interface générique avec la valeur de type d'exécution et utiliser IsAssignableFrom pour vérifier la compatibilité.

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

Est-il possible que je puisse obtenir des résultats différents si je l'ai fait dans l'autre sens? Est-ce que cela peut déjà être faux? 'typeof (IComparable <>). MakeGenericType (o1.GetType()). IsAssignableFrom (o2.GetType()) == typeof (IComparable <>). MakeGenericType (o2.GetType()). IsAssignableFrom (o1.GetType ()) ' – AFusco

+0

Je ne suis pas sûr que la comparaison a beaucoup de sens .. vous comparez' T2 is ICoamparable 'à' T1 est IComparable '... –

+0

Pour l'expression dans la méthode pour renvoyer true le type de propriété aurait ti être quelque chose mettant en œuvre 'IComparable ' –