J'utilise une méthode similaire à la suivante pour obtenir des métadonnées précalculées liées aux propriétés d'un type.Correspondance d'une propriété ProperyInfo avec une propriété PropertyInfo
MyData GetProperty<T, U>(Expression<Func<T, U>> member)
{
// Get the property referenced in the lambda expression
MemberExpression expression = member.Body as MemberExpression;
PropertyInfo property = expression.Member as PropertyInfo;
// get the properties in the type T
PropertyInfo[] candidates = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Find the match
foreach (PropertyInfo candidate in candidates)
if (candidate == property)
return GetMetaData<T>(candidate);
throw new Exception("Property not found.");
}
// Returns precomputed metadata
MyData GetMetaData<T>(PropertyInfo property) { ... }
Comme on peut s'y attendre, il fonctionne lorsqu'il est utilisé comme suit:
var data = PropertyInfo((Employee e) => e.Name);
Mais pas quand il est utilisé dans la méthode générique suivante:
void MyGenericMethod<T>(int id) where T : IEmployee
{
var data = PropertyInfo((T e) => e.Name);
}
Il échoue parce que le type déclarant de property
dans la première méthode est maintenant IEmployee
, donc la propriété dans le lambda ne correspond pas à la propriété dans le type. Comment puis-je les faire correspondre, sans compter sur les noms des propriétés? (Il peut y avoir plusieurs propriétés avec le même nom si les interfaces sont implémentées explicitement, donc p1.Name == p2.Name
ne le coupera pas).
Ce n'est pas joli, mais 'InterfaceMapping' a fait l'affaire. Merci. – Greg