2011-10-18 18 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'ループの2つの辞書に変換することができます。 – SLaks

+3

なぜLINQに問題がありますか?これは現在いくつかのバージョンの標準機能であり、アイデアを簡潔に表現するための強力なツールです。私は99%あなたが他の答えを取り、それを他の構造に巻き戻すことができると確信していますが、なぜ気にしませんか? – Joe

+0

@SLaksしてください。 –

答えて

3

+0

ToString()メソッドを追加しました。私が求めているのは簡単なことです。 –

0

同じことは、クラスとコレクションのデフォルトプロパティを使用することで達成できます。文字列が常に必要な場合は、Dictionaryクラスをデフォルトのプロパティとして使用できます。

次に、コンストラクタであなたはあなたが、その後、「いくつかの文字列」を返します[「S」]これはMyClass、コレクションとしてのMyClassを使用することができmyDictionary["s"] = "some string";

をintializeことができます。

リフレクションは、必要なジョブを実行するためのAPIを作成していないことを示す指標です。変更するコードがある場合は、デフォルトプロパティを使用することをおすすめします。

は、参照してください。このMSDN article

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(); 

    } 
} 
6

あなたは名前でプロパティ値を取得するために拡張メソッドとリフレクションを使用することができますクラスを制御することはできませんと使用(EDIT - コメントあたり):

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

cに関係なく、cのインスタンスのSという名前の(public)プロパティの値を与え、LINQを使用する理由はわかりませんが、LINQはまったく使用しません問題...

+0

mmm、拡張反射特性。その拡張クラスを "オブジェクト"に置くと、そのプロパティをどのクラスにも追加することができます。 – Spence

+0

クールで私はそれを投票しました。 –

関連する問題