有没有办法获取传递给函数的值的属性名称?
答案 0 :(得分:5)
只有你使用lambda,即。
SomeMethod(()=>someObj.PropName);
(使用该方法采用类型化表达式树而不仅仅是值)
然而,这仍然需要相当多的处理来解决并涉及反射和表达。除非绝对必要,我会避免这种情况。仅仅为此学习表达是不值得的。
答案 1 :(得分:5)
你在问这是否可行?
public void PrintPropertyName(int value) {
Console.WriteLine(someMagicCodeThatPrintsThePropertyName);
}
// x is SomeClass having a property named SomeNumber
PrintInteger(x => x.SomeNumber);
和“SomeNumber”将打印到控制台?
如果是,不。这显然是不可能的(提示:PrintPropertyName(5)
会发生什么?)。但你可以这样做:
public static string GetPropertyName<TSource, TProperty>(this Expression<Func<TSource, TProperty>> expression) {
Contract.Requires<ArgumentNullException>(expression != null);
Contract.Ensures(Contract.Result<string>() != null);
PropertyInfo propertyInfo = GetPropertyInfo(expression);
return propertyInfo.Name;
}
public static PropertyInfo GetPropertyInfo<TSource, TProperty>(this Expression<Func<TSource, TProperty>> expression) {
Contract.Requires<ArgumentNullException>(expression != null);
Contract.Ensures(Contract.Result<PropertyInfo>() != null);
var memberExpression = expression.Body as MemberExpression;
Guard.Against<ArgumentException>(memberExpression == null, "Expression does not represent a member expression.");
var propertyInfo = memberExpression.Member as PropertyInfo;
Guard.Against<ArgumentException>(propertyInfo == null, "Expression does not represent a property expression.");
Type type = typeof(TSource);
Guard.Against<ArgumentException>(type != propertyInfo.ReflectedType && type.IsSubclassOf(propertyInfo.ReflectedType));
return propertyInfo;
}
用法:
string s = GetPropertyName((SomeClass x) => x.SomeNumber);
Console.WriteLine(s);
现在“SomeNumber”将打印到控制台。
答案 2 :(得分:2)
没有。在调用函数之前,将对属性进行评估,函数中的实际值将是该值的副本,而不是属性本身。