如何获取所选属性的名称?

时间:2014-05-23 18:26:00

标签: c# linq entity-framework reflection

场景如下: - EF存储过程返回5列作为DataResult - 我只需要3列,所以我编码了

var data = (from i in db.GetDataResult()
               select new DataResult
                 {
                   prop1 = i.prop1,
                   prop2 = i.prop2,
                   prop3 = i.prop3,
                     }).ToList();
  • 如果没有硬编码字符串名称,我想获取所选列的名称,即prop1,prop2和prop3。

如何以编程方式实现此目标?

2 个答案:

答案 0 :(得分:1)

如Steve所述,Where()可用于过滤:

List<string> names = GetDesiredListOfNamesSomehow();
var props = typeof( DateTime ).GetProperties()
       .Where( i => names.Contains( i.Name ) ).Select( i => i.Name );
foreach (var prop in props)
{
    Console.WriteLine("Prop Name: " + prop);
}

但是,如果您知道要过滤的名称,则无需请求名称。所以我假设你试图自己获得实际的属性:

var props = typeof( DateTime ).GetProperties().Where( i => names.Contains( i.Name ) );
foreach (var prop in props)
{
    Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}

答案 1 :(得分:1)

我想我明白了。你说你不需要过滤器,你已经做过了;您想要获取映射的列名称。首先看this answer

那就是基于@John Arlen的回答:

foreach (var prop in data[0].GetType().GetProperties())
{
    Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}

这里的问题是这通常应该给你:

prop1, *some type*
prop2, *some type*
prop3, *some type*

令人困惑的是,在知道名称之前,您以某种方式指定了列,但在代码示例中, 使用列名称。您指定的列应与列名称匹配;代码中的prop1应与数据源中的列prop1相对应。您暗示要根据列名过滤要获取的列(以及获取的列)。

因此,假设您已根据其他一些(未指定的)标准事先知道您想要哪些列;也就是说,如果您知道自己获得了prop1prop2prop3,却没有propXpropY。显然,如果您不知道名称,则无法在过滤列/属性之前获取列/属性名称​​。

修改

我觉得你可能想要确定哪些字段被填充,哪些不是。如果您知道没有任何字段为空,则此可能有效:

foreach (var prop in data[0].GetType().GetProperties())
{
    if (prop.GetValue(data[0], null) != null)
        Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}

修改2

另见this SO question