获取属性名称

时间:2010-11-04 17:12:27

标签: c#

有没有办法获取传递给函数的值的属性名称?

3 个答案:

答案 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)

没有。在调用函数之前,将对属性进行评估,函数中的实际值将是该值的副本,而不是属性本身。