c# - 如何在运行时创建表达式

标签 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)}
    }
    

最佳答案

首先,您的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;
    }
}

如果该属性不是公共(public)的,则必须使用 different overload of GetProperty 并使用 BindingFlags.NonPublic | BindingFlags.Instance绑定(bind)标志。

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

关于c# - 如何在运行时创建表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21880410/

相关文章:

c# - 在 C#/.NET 中处理基督之前日期的(最佳)方法是什么?

c# - 正则表达式 '(?!^()$)' 可以匹配任何内容吗?

c# - 将强类型表达式转换为匿名类型返回

c++ - 为什么在构造字符串时 `std::istreambuf_iterator<char>`被视为函数声明?

c# - 如何获取从表单/字符串中获取的值的系统类型?

c# - 如何判断 ParameterInfo 类型是否为集合?

c# - 如何为 C# 项目生成 .tlh 文件

c# - 为什么在尝试使用动态参数调用扩展方法时出现错误 CS1973

c# - 在 C# 中确认格林斯彭第十定律

c# - 如何获取类属性的名称?