Puis-je obtenir des métadonnées spécifiques d’un object Func ?

Considérons le code suivant:

ssortingng propertyName; var dateList = new List() { DateTime.Now }; propertyName = dateList.GetPropertyName(dateTimeObject => dateTimeObject.Hour); // I want the propertyName variable to now contain the ssortingng "Hour" 

Voici la méthode d’extension:

 public static ssortingng GetPropertyName(this IList list, Func func) { //TODO: would like to dynamically determine which // property is being used in the func function/lambda } 

Y a-t-il un moyen de faire cela? Je pensais que peut-être cette autre méthode, utilisant Expression<Func> au lieu de Func me donnerait plus de pouvoir pour trouver ce dont j’ai besoin, mais je ne sais pas comment.

 public static ssortingng GetPropertyName(this IList list, Expression<Func> expr) { // interrogate expr to get what I want, if possible } 

C’est la première fois que je fais quelque chose d’aussi profond avec Linq, alors il me manque peut-être quelque chose d’évident. En gros, j’aime bien l’idée de transmettre des lambdas, afin de pouvoir vérifier le temps de compilation, mais je ne sais pas si mon idée de la façon dont je peux les utiliser dans ce cas particulier fonctionnera.

Merci

Ceci est la version que j’utilise, il retourne un PropertyInfo , mais obtenir le nom est sortingvial.

 public static PropertyInfo GetProperty(Expression> expression) { MemberExpression memberExpression = null; if (expression.Body.NodeType == ExpressionType.Convert) { memberExpression = ((UnaryExpression) expression.Body).Operand as MemberExpression; } else if (expression.Body.NodeType == ExpressionType.MemberAccess) { memberExpression = expression.Body as MemberExpression; } if (memberExpression == null) { throw new ArgumentException("Not a member access", "expression"); } return memberExpression.Member as PropertyInfo; } 

Voici un moyen très simple et rapide de le faire sur ce blog: http://blog.bittercoder.com/PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx

Donc, étant donné:

Func func = Nom => “Valeur”;

Vous pouvez obtenir le paramètre “Nom” lambda à partir du délégué de la fonction en appelant:

func.Method.GetParameters () [0] .Name (renverrait “Nom”)

Voici la méthode de hachage révisée d’Andrey:

 public Dictionary Hash(params Func[] args) where T : class { var items = new Dictionary(); foreach (var func in args) { var item = func(null); items.Add(func.Method.GetParameters()[0].Name, item); } return items; } 

J’espère que ça aide, Pasortingck

Quelque chose comme ça devrait faire l’affaire:

 public static ssortingng GetPropertyName(this IList list, Expression> expr) { MemberExpression member_expression = expr.Body as MemberExpression; if (member_expression == null) throw new ArgumentNullException("member_expression"); MemberInfo member = member_expression.Member; PropertyInfo property = member as PropertyInfo; ssortingng proname = memeber.name; } 

AVERTISSEMENT: Code aérien!

Juste une note de côté: func.Method.GetParameters () [0] .Name est extrêmement rapide par rapport à la compilation du lambda et à l’extraction de l’expression du membre, puis aux informations sur le membre, puis au nom.