Comment obtenir un nom de propriété d'un type donné fortement typé?

.net c# expression-trees reflection

Question

Je voudrais pouvoir récupérer le nom d'une propriété d'un type en utilisant une syntaxe fortement typée. J'ai déjà une fonction pour obtenir le nom de propriété d'une instance:

public static string PropertyName<T, TReturn>(this T obj, Expression<Func<T, TReturn>> property) where T : class 
{
    MemberExpression body = (MemberExpression) property.Body;
    if (body == null) throw new ArgumentException("The provided expression did not point to a property.");       
    return body.Member.Name;
}

Ce qui peut s'appeler comme ça:

public static string PropertyName<T, TReturn>(this T obj, Expression<Func<T, TReturn>> property) where T : class 
{
    MemberExpression body = (MemberExpression) property.Body;
    if (body == null) throw new ArgumentException("The provided expression did not point to a property.");       
    return body.Member.Name;
}

J'essaie de créer une autre fonction qui pourrait prendre en charge les éléments suivants:

public static string PropertyName<T, TReturn>(this T obj, Expression<Func<T, TReturn>> property) where T : class 
{
    MemberExpression body = (MemberExpression) property.Body;
    if (body == null) throw new ArgumentException("The provided expression did not point to a property.");       
    return body.Member.Name;
}

Ou tout simplement (encore mieux!):

public static string PropertyName<T, TReturn>(this T obj, Expression<Func<T, TReturn>> property) where T : class 
{
    MemberExpression body = (MemberExpression) property.Body;
    if (body == null) throw new ArgumentException("The provided expression did not point to a property.");       
    return body.Member.Name;
}

Comment pourrais-je m'y prendre?

Réponse acceptée

Vous pouvez réécrire votre méthode pour l'utiliser sans créer d'instance:

var prop = ReflectionHelper.PropertyName<Car>(x => x.Wheels);

parce que tu n'utilises pas obj inside parce que tu n'en as pas besoin:

var prop = ReflectionHelper.PropertyName<Car>(x => x.Wheels);

Notez que le type de retour n'a pas besoin d'être fortement typé, il peut simplement s'agir d'un object .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi