2011-10-18 120 views
3

我需要通過索引或類似的東西訪問屬性。原因解釋在this already answered question。這個答案使用Linq,我更喜歡沒有這種依賴的東西。我無法控制課程。按索引訪問屬性

public class myClass 
{ 
    private string s = "some string"; 
    public string S 
    { 
     get { return s; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     myClass c = new myClass(); 
     // I would like something similar 
     // or same functionality 
     string s = c["S"]; 
    } 
} 
+3

LINQ不是依賴項;它是.Net 3.5核心的一部分。如果你被困在.Net 2.0中,你可以簡單地用一個字典將這個答案轉換成幾個foreach循環。 – SLaks

+3

爲什麼LINQ的問題?這是現在幾個版本的標準功能,並且是用於簡明表達想法的強大工具。我99%肯定你可以採取其他答案,並將其展開到其他構造,但爲什麼要麻煩? – Joe

+0

@SLaks請做。 –

回答

3

使用(編輯 - 按照評論):

string s = c.GetType().GetProperty ("S").GetGetMethod().Invoke (c, null).ToString(); 

它提供了c實例c的名稱爲S的(公共)屬性的值,不管c的類型如何,並且根本不使用LINQ,儘管我必須承認我不明白爲什麼LINQ應該是問題...

+0

剛添加了ToString()方法。這是我要求的簡單。 –

0

您可以通過在類和集合上使用默認屬性來達到同樣的效果。假設你總是需要字符串,你可以使用Dictionary類作爲你的默認屬性。

然後在構造函數中,你可以intialize myDictionary["s"] = "some string";

然後,您可以使用myClass的集合對象,所以myClass的[「S」]將返回「一些字符串」。

反射通常表示您沒有創建API來完成您需要的工作,如果您有要修改的代碼,那麼我建議您使用默認屬性。

看到這個MSDN article

6

當你有過類,你可以使用擴展方法和反思的名字來獲得屬性值沒有控制:

static class ObjectExtensions 
{ 
    public static TResult Get<TResult>(this object @this, string propertyName) 
    { 
     return (TResult)@this.GetType().GetProperty(propertyName).GetValue(@this, null); 
    } 
} 

用法:

class A 
{ 
    public string Z 
    { 
     get; 
     set; 
    } 

    public int X 
    { 
     get; 
     set; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     A obj = new A(); 
     obj.Z = "aaa"; 
     obj.X = 15; 

     Console.WriteLine(obj.Get<string>("Z")); 
     Console.WriteLine(obj.Get<int>("X")); 
     Console.ReadLine(); 

    } 
} 
+0

mmm,擴展反射屬性。如果你把這個擴展類放在「對象」上,你幾乎可以將這個屬性添加到任何類中去? – Spence

+0

很酷,我投了票。 –