2009-10-29 210 views
10

是否有任何方法來動態設置匿名類型的屬性名稱?動態設置C#匿名類型的屬性名稱

通常我們會做這樣的:

var anon = new { name = "Kayes" }; 

現在,我想動態設置屬性的名稱(或標識),所以這個名字可能來自一個XML文件或數據庫。


謝謝你們的答案。不,我的需求絕對不值得所有繁瑣的選擇。我只是想讓我的代碼符合由我的團隊負責人開發的現有庫。但我們決定更新庫來支持字典類型,以便輕鬆解決。

皮特,我真的很興奮,瞭解動態類型在.NET 4.0中

感謝。

+0

對於最近的C#版本,請參閱:http://stackoverflow.com/questions/3740021/how -to-動態新的匿名級 – nawfal 2015-07-30 09:36:22

回答

2

不是沒有大量的反思,可能比你對利用你正在做的事情感興趣。也許你應該考慮使用一個字典,其中鍵值是屬性名稱。

0

編譯器必須知道屬性名稱,否則它不能爲您創建匿名類型。

所以,不,這是不可能的,除非實際的屬性名在編譯時已知(通過一些由VS生成的數據庫或其他東西)。

3

這是不可能的,因爲即使該類型是匿名的,它也不是動態類型。它仍然是一個靜態類型,並且在編譯時必須知道它的屬性。

您可能想要查看.NET 4.0「dynamic」關鍵字以生成真正的動態類。

0

都能跟得上。你想從動態信息構造一個靜態結構。不行,想想吧。爲你的情況使用一本字典。

1

如前所述,您不能更改屬性名稱;例如,你會如何對它進行編碼?但是,如果這用於數據綁定,則可以在運行時執行一些技巧來彎曲屬性的顯示名稱,例如ICustomTypeDescriptor/TypeDescriptionProvider(和自定義PropertyDescriptor)。

很多工作;那就需要真的是值得的......

另一種選擇是一個自定義屬性:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
class MyDisplayNameAttribute : DisplayNameAttribute { 
    public MyDisplayNameAttribute(string value) : base(value) {} 
    public override string DisplayName { 
     get { 
      return @"/// " + base.DisplayNameValue + @" \\\"; 
     } 
    } 
} 
class Foo { 
    [MyDisplayName("blip")] 
    public string Bar { get; set; } 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     using (Form form = new Form { 
      Controls = { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo { Bar = "abc"}} 
      } 
     }) { 
      Application.Run(form); 
     } 
    } 
}