2011-05-12 47 views
9

是否有任何工具,庫,可以讓我訪問我的對象屬性索引器樣式?C#訪問對象屬性索引器樣式

public class User 
{ 
    public string Name {get;set;} 
} 

User user = new User(); 
user.Name = "John"; 

string name = user["Name"]; 

也許動態關鍵詞可以幫助我嗎?

+1

出於興趣。你爲什麼要這樣做? – 2011-05-12 08:55:32

+0

我想建立一個通用的方式來做一些報告的東西。 – user256034 2011-05-12 08:57:45

回答

3

查看有關索引器的this。字典存儲所有的值和鍵,而不是使用屬性。這樣,您可以在運行時添加新屬性而不會損失性能

public class User 
{ 
    Dictionary<string, string> Values = new Dictionary<string, string>(); 
    public string this[string key] 
     { 
      get 
      { 
       return Values[key]; 
      } 
      set 
      { 
       Values[key] = value; 
      } 
     } 
} 
+0

有很多對象,因此爲每個對象實現此操作都不是一個選項。 – user256034 2011-05-12 08:55:52

+0

@ user256034您只需執行一次,然後將值存儲在字典中而不是屬性中。 – 2011-05-12 08:57:43

0

您可以使用反射和索引器自行構建它。

但是,你需要什麼樣的解決方案?

10

您可以使用反射通過其名稱來獲得屬性值

PropertyInfo info = user.GetType().GetProperty("Name"); 
    string name = (string)info.GetValue(user, null); 

如果你想使用索引爲此,你可以嘗試這樣的事情

public object this[string key] 
    { 
     get 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info == null) 
       return null 
      return info.GetValue(this, null); 
     } 
     set 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info != null) 
       info.SetValue(this,value,null); 
     } 
    } 
+1

這不會傷害我的表現嗎? – user256034 2011-05-12 08:56:29

+1

@ user256034非常多。但是在運行時查找屬性非常慢。您可以快速完成的唯一方法是使用我的實施 – 2011-05-12 08:58:26

+0

不如使用動態。 Dynamics基本上根據需要在運行時進行編譯。 – 2011-05-12 09:00:01

1

你不能做到這一點,直到類實現了一個Indexer。

2

您當然可以繼承DynamicObject並以此方式進行操作。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx

使用他人這裏提到的簡單索引方法會限制你要麼只返回「對象」(和具有投),或在你的類只有字符串類型。

編輯:如別處所述,即使使用動態,您仍需要使用反射或某種形式的查找來檢索TryGetIndex函數內的值。

+0

你能舉個例子嗎? – user256034 2011-05-12 08:55:02

+0

@ user256034上面的鏈接有一個體面的例子。 – 2011-05-12 08:57:29

1

如果你只是想根據您可以使用反射做同樣的事情一個字符串值來訪問屬性:

string name = typeof(User).GetProperty("Name").GetValue(user,null).ToString();