繁体   English   中英

如何在运行时创建表达式

[英]How to create expression at run-time

我有一个包含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)} } 

首先,您的MyClass具有字段,而不是属性。 您必须将其更改为public int i {get; set;} 例如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;
    }
}

如果该属性不是公共属性,则必须使用不同的GetProperty重载并使用BindingFlags.NonPublic | BindingFlags.Instance BindingFlags.NonPublic | BindingFlags.Instance绑定标志。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM