在运行时获取C#中属性的字符串表示形式

时间:2010-04-20 15:37:23

标签: c# linq data-binding reflection

我已经看过这个问题的反面很多次,但还没有看到如何做我想做的事。

假设我有以下代码:

var myNewData = from t in someOtherData
            select new
            { 
                fieldName = t.Whatever,
                fieldName2 = t.SomeOtherWhatever
            };

如果我希望数据绑定到此类,我的列定义必须包含硬编码字符串,如“fieldName”和“fieldName2”。

有没有办法调用反射或其他东西,以便我可以做一些与下面的代码相同的事情(我知道下面的代码是无效的,但我正在寻找一个有效的解决方案。)

string columnName = GetPropertyName(myNewData[0].fieldName);

我的目标是,如果变量名在匿名类上发生更改,则会在修复所有引用之前出现编译时错误,这与当前数据绑定不同,后者依赖于直到运行时才检查的字符串。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:7)

string columnName = GetPropertyName(() => myNewData[0].fieldName);

// ...

public static string GetPropertyName<T>(Expression<Func<T>> expr)
{
    // error checking etc removed for brevity

    MemberExpression body = (MemberExpression)expr.Body;
    return body.Member.Name;
}

答案 1 :(得分:2)

你得到这样的属性名称:

using System.Reflection;    

var myNewData = from t in someOtherData
        select new
        { 
            fieldName = t.Whatever,
            fieldName2 = t.SomeOtherWhatever
        };


foreach (PropertyInfo pinfo in myNewData.FirstOrDefault()
                               .GetType().GetProperties()) 
{ 
    string name = pinfo.Name; 
}

// or if you need all strings in a list just use:
List<string> propertyNames = myNewData.FirstOrDefault()
             .GetType().GetProperties().Select(x => x.Name).ToList();