我已经看过这个问题的反面很多次,但还没有看到如何做我想做的事。
假设我有以下代码:
var myNewData = from t in someOtherData
select new
{
fieldName = t.Whatever,
fieldName2 = t.SomeOtherWhatever
};
如果我希望数据绑定到此类,我的列定义必须包含硬编码字符串,如“fieldName”和“fieldName2”。
有没有办法调用反射或其他东西,以便我可以做一些与下面的代码相同的事情(我知道下面的代码是无效的,但我正在寻找一个有效的解决方案。)
string columnName = GetPropertyName(myNewData[0].fieldName);
我的目标是,如果变量名在匿名类上发生更改,则会在修复所有引用之前出现编译时错误,这与当前数据绑定不同,后者依赖于直到运行时才检查的字符串。
任何帮助都将不胜感激。
答案 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();