簡體   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