如何在运行时创建表达式

时间:2014-02-19 12:24:30

标签: c# expression gettype

我有一个类包含4个属性:

class MyClass
{
    public int i{get;set;}
    public double d{get;set;}
    public string s{get;set;}
    public char c{get;set;}
}

这个班级的清单:

var lstSource = new List<MyClass>
{
    new MyClass {i = 1, d = 1.2, s = "s1", c = '1'},
    new MyClass {i = 2, d = 2.2, s = "s2", c = '2'},
    new MyClass {i = 3, d = 3.2, s = "s3", c = '3'}
};

现在我想从最终用户那里获得一些这些属性的名称,并获取一个匿名类型包含所需属性的列表。用户将所需属性列表作为字符串集合(所需属性的名称)。例如,假设所需属性列表如下:

var wantedProperties = new List<string> {"i", "s"};
  • 问题1:如何仅从lstSource获取这些属性?

  • 问题2:如何在匿名列表中提供每个属性的类型作为新变量?对于“wantedProperties”中的每个项目,它最多添加另一个变量到结果列表帽子显示所需属性的类型。在这个例子中,结果列表大多数是这样的:

    {
        {WantedProperty1_Value = 1,WantedProperty1_Type = typeof(int)},
        {WantedProperty2_Value = 2,WantedProperty2_Type = typeof(string)}
    }
    

1 个答案:

答案 0 :(得分:3)

首先,您的MyClass包含字段,而不是属性。例如,您必须将这些更改为public int i {get; set;}

现在,您可以使用反射来获取由其名称标识的属性的类型

foreach(MyClass obj in lstSource)
{
    foreach(string propertyName in wantedProperties)
    {
        PropertyInfo property = typeof(MyClass).GetProperty(propertyName);

        object value = property.GetValue(obj);
        Type propertyType = property.PropertyType;
    }
}

如果该属性不公开,则必须使用different overload of GetProperty并使用BindingFlags.NonPublic | BindingFlags.Instance绑定标记。

现在你要做的就是构建结果集。