C# 如何仅获取选定属性的名称?
场景如下: -EF存储过程返回5列作为DataResult -我只需要3列,所以我编码了C# 如何仅获取选定属性的名称?,c#,linq,entity-framework,reflection,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,
var data = (from i in db.GetDataResult()
select new DataResult
{
prop1 = i.prop1,
prop2 = i.prop2,
prop3 = i.prop3,
}).ToList();
- 如果没有硬编码字符串名称,我希望获得所选列的名称,即prop1、prop2和prop3
如何通过编程实现这一点?如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);
}
我想我明白了。你是说你不需要过滤器,你已经这样做了;您希望获得映射的列名。先看 也就是说,根据@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*
令人困惑的是,您在知道名称之前就以某种方式指定了列,但在代码示例中使用的是列名。指定的列应与列名匹配<代码中的code>prop1应与数据源中的prop1
列相对应。您的意思是希望根据列名筛选要获取的列(以及不获取的列)
因此,这是假设您已经根据其他一些(未指定的)标准预先知道需要哪些列;也就是说,如果您知道您得到的是prop1
、prop2
和prop3
,但不是propX
或propY
。显然,如果不知道列/属性的名称,则在筛选列/属性之前无法获取列/属性的名称
编辑
我突然想到,您可能想要确定哪些字段正在填充,哪些字段未填充。如果您知道所有字段都不为空,这可能会起作用:
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
另请参见。
typeof(DataType).GetProperties()。其中(p=>p.Name.Contains(“某物”)。选择(p=>p.Name)
将返回包含“某物”的所有属性的名称。您可以使用Where()
子句对任何内容进行筛选。您可以使用一个只包含您要查找的字段的匿名对象,而不是选择新数据结果。请参阅示例。如果选择anonymous,则会出现无法将anonymoustype转换为IList或IEnumerable的错误。但是使用匿名而不是指定类型有什么好处呢?它也在处理匿名类型,var s=x.GetType().GetProperties().Where(p=>p.Name.Contains(“something”).Select(p=>p.Name.FirstOrDefault()代码>但这仍然需要将属性名作为字符串提前手写,就像您在新字符串[]{“Date”、“Day”、“DayOfWeek”}中所做的那样;然而,我要寻找的是从var数据中获取prop1、prop2和prop3的名称,如主要示例中所述,以避免弄乱字符串。您打算如何确定您想要的属性?这就是我试图实现的目标。第一步是仅从DB存储过程中选择或筛选我需要的列/属性,就像我在主文章的第二个代码示例中所做的那样…第二步,我希望使用反射或任何其他技术来获取我在第一步中选择/过滤的属性/列的名称。上面的硬编码字符串就是一个例子。使用任何来源(数据库或任何东西)作为输入;如何在不知道名称的情况下先筛选(使用列名),然后再获取列名?您没有根据列名筛选所需的列吗?谢谢您的坚持。数据[0].GetType().GetProperties()基于null或not null这正是我所需要的-我在John的回答中没有看到这一部分。你是对的,我事先就知道我想要哪些栏目是基于“未指定”的标准的——我想这很明显——我的错误。关于这个例子,我假设您知道prop1、2和3不是硬编码字符串,或者换句话说,您可以使用intellisense获取它们。谢谢你的帮助链接。
foreach (var prop in data[0].GetType().GetProperties())
{
if (prop.GetValue(data[0], null) != null)
Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}