【问题标题】:How to Get the Names of Only the Selected Properties?如何仅获取选定属性的名称?
【发布时间】:2014-05-29 00:47:43
【问题描述】:

场景是这样的: - 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。

如何以编程方式实现这一点?

【问题讨论】:

  • typeof(DataType).GetProperties().Where(p => p.Name.Contains("something")).Select(p => p.Name) 将返回包含“某物”的所有属性的名称。您可以使用 Where() 子句过滤任何内容。除了select new DataResult,您可以使用只包含您要查找的字段的匿名对象。例如,请参阅stackoverflow.com/questions/3645494/…
  • 如果我选择匿名,我会收到无法将匿名类型转换为 IList 或 IEnumerable 的错误。但是,使用匿名而不是指定类型有什么好处呢?
  • 它也适用于匿名类型,var s = x.GetType().GetProperties().Where(p => p.Name.Contains("something")).Select(p => p.Name).FirstOrDefault();

标签: c# linq entity-framework reflection


【解决方案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

【讨论】:

  • 感谢您的坚持。 data[0].GetType().GetProperties() 基于 null 或 not null 这正是我所需要的 - 我在约翰的回答中没有看到那部分。你是对的,我事先知道基于“未指定”标准我想要哪些列 - 我认为这很清楚 - 我的错误。关于这个例子,我假设你知道 prop1、2 和 3 不是硬编码字符串,或者换句话说,你可以使用智能感知来获取它们。也感谢您提供有用的链接。
【解决方案2】:

正如 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);
}

【讨论】:

  • 但这仍然需要提前将属性名称作为字符串手动写入 - 正如您在 new string[] {"Date", "Day", "DayOfWeek"}; 中所做的那样但是,我正在寻找的是从 var 数据中获取 prop1、prop2 和 prop3 的名称,如主要示例中所述,以避免混淆字符串。
  • 您打算如何确定您想要的哪些属性?
  • 这就是我想要完成的。第一步是仅从数据库存储的 Proc 中选择或过滤我需要的列/属性,就像我在主帖的第二个代码示例中所做的那样......其次,我希望使用反射或任何其他技术来获取我在第一步中选择/过滤的属性/列的名称。
  • 上面的硬编码字符串就是一个例子。使用任何来源(数据库或其他)作为输入。
  • 我还是不明白;如何在不知道名称的情况下先过滤(使用列名),然后然后获取列名?你不是根据列名过滤你想要的列吗?
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 2012-01-09
  • 1970-01-01
  • 2010-10-14
  • 2017-05-04
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多