如何从 select 列表中仅根据 属性 名称列表中的某些属性?
How to select from the list only some properties depending from list of property names?
我正在寻找结果是匿名但属性是从字符串列表中给出的选择
例子
public class A{
public string PropertyA {get; set;}
public double PropertyB {get; set;}
public double PropertyC {get; set;}
public double PropertyD {get; set;}
}
var list = new List<A>{ ... };
var propertyNames = new List<string>{"PropertyA", "PropertyD"}
我想创建一个 选择器,它使用 PropertyA 和 PropertyD 创建一个匿名的,这样我就可以得到类似
的东西
var result = list.Select( selector(propertynames) ).ToList();
result[0] 再次是匿名的,具有 result[0].PropertyA 和 result[0].PropertyD
等属性
我真的,真的建议对此采取不同的做法。
但是,这是解决此问题的一种方法 - 使用 System.Dynamic.ExpandoObject
:
var result = list
.Select(i =>
{
var expando = new ExpandoObject();
var expandoAsDict = (IDictionary<string, object>)expando;
var targetProperties = i
.GetType()
.GetProperties()
.Where(p => propertyNames.Contains(p.Name))
.ToDictionary(p => p.Name, p => p.GetValue(i));
foreach (var property in targetProperties)
{
expandoAsDict.Add(property);
}
return (dynamic)expando;
})
.ToList();
然后您可以按照您的描述进行操作,例如:
Console.WriteLine(result[0].PropertyA);
写出期望值。
当然,您可以忘记对动态类型的 Intellisense 支持(如果一开始这不是很明显的话)。
注意:另一种方法是在运行时使用 System.Reflection.Emit
构造您的类型,但这会更加尴尬。
祝你好运!
我正在寻找结果是匿名但属性是从字符串列表中给出的选择
例子
public class A{
public string PropertyA {get; set;}
public double PropertyB {get; set;}
public double PropertyC {get; set;}
public double PropertyD {get; set;}
}
var list = new List<A>{ ... };
var propertyNames = new List<string>{"PropertyA", "PropertyD"}
我想创建一个 选择器,它使用 PropertyA 和 PropertyD 创建一个匿名的,这样我就可以得到类似
的东西var result = list.Select( selector(propertynames) ).ToList();
result[0] 再次是匿名的,具有 result[0].PropertyA 和 result[0].PropertyD
等属性我真的,真的建议对此采取不同的做法。
但是,这是解决此问题的一种方法 - 使用 System.Dynamic.ExpandoObject
:
var result = list
.Select(i =>
{
var expando = new ExpandoObject();
var expandoAsDict = (IDictionary<string, object>)expando;
var targetProperties = i
.GetType()
.GetProperties()
.Where(p => propertyNames.Contains(p.Name))
.ToDictionary(p => p.Name, p => p.GetValue(i));
foreach (var property in targetProperties)
{
expandoAsDict.Add(property);
}
return (dynamic)expando;
})
.ToList();
然后您可以按照您的描述进行操作,例如:
Console.WriteLine(result[0].PropertyA);
写出期望值。
当然,您可以忘记对动态类型的 Intellisense 支持(如果一开始这不是很明显的话)。
注意:另一种方法是在运行时使用 System.Reflection.Emit
构造您的类型,但这会更加尴尬。
祝你好运!