2015-12-30 19 views
5

オブジェクトからフィールドを返す関数を作成しようとしています。名前でフィールドを取得

これまで私がこれまで持っていたことは次のとおりです。私が好きな理想的だろうか

public class Base 
{ 
    public string thing = "Thing"; 
    public T GetAttribute<T>(string _name) 
    { 
     return (T)typeof(T).GetProperty(_name).GetValue(this, null); 
    } 
} 

は呼び出すことです:

string thingy = GetAttribute<string>("thing"); 

が、私はnull参照の例外を取得しておくので、この上に読み込むときに、私はスティックの間違った終わりを得た感覚を持っています。

+0

次の答えを使用しますfrom [here](http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in-c-sharp) –

+1

C#では、「属性」という用語に具体的な意味:これは、とりわけ、クラスやメソッドに取り付けることができるメタデータの一部です。それはあなたの質問に関するものではありません - 正しい用語は、あなたが 'フィールド'または '財産'の価値を得るために '反映'を使用しているということです。 –

答えて

3

最初のもの - thingは、プロパティではなくフィールドです。

ところで
public class Base { 

    public string thing = "Thing"; 

    public T GetAttribute<T> (string _name) { 
     return (T)typeof(Base).GetField(_name).GetValue (this, null); 
    } 
} 

- あなたは、インスタンスを参照することにより、プロパティ/フィールドの値を取得することができます:

もう一つは、あなたはそれが働いて取得するパラメータの種類を変更する与えたということである

var instance = new Base(); 
var value = instance.thing; 
+0

非常にありがとう、それは魅力を動作させる!私は前に言及していないために私のせいである唯一の問題がある、ベースは、他のものによって継承されるつもりです、 "タイプ(これ)"タイプのものの一種を言うための方法はありますか? – inadequateMonkey

+0

あまりにもBTWのおかげで、これは非常に非合理に思われるが、これを必要とする非常に長く複雑な理由があることを知っている、私はそれに行くつもりはない:) – inadequateMonkey

+1

@inadequateMonkey 'typeof(Base)の代わりに' this.GetType ) ' –

5

thingは、プロパティではありません。 GetPropertyの代わりにGetFieldメソッドを使用する必要があります。 別の問題は、あなたが探しているのですtypeof(T)です。あなたはtypeof(Base)のフィールドを探してください。あなたは、これが

public static class Ex 
{ 
    public static TFieldType GetFieldValue<TFieldType, TObjectType>(this TObjectType obj, string fieldName) 
    { 
     var fieldInfo = obj.GetType().GetField(fieldName, 
      BindingFlags.Instance | BindingFlags.Static | 
      BindingFlags.Public | BindingFlags.NonPublic); 
     return (TFieldType)fieldInfo.GetValue(obj); 
    } 
} 

のようにそれを使用して使用することができますタイプのフィールドの値を取得するための拡張メソッドを持つようにしたい場合は

全体の機能が

public T GetAttribute<T>(string _name) 
{ 
    return (T)GetType().GetField(_name).GetValue(this); 
} 

に変更する必要があります

var b = new Base(); 
Console.WriteLine(b.GetFieldValue<string, Base>("thing")); 

BindingFlagsを使用すると、たとえそれがprivaであってもフィールド値を取得するのに役立ちますteまたは静的フィールド。

+0

私は私の答えを改善することができますdownvoteの理由を説明できますか? – dotctor

+0

これは問題の一部のみを解決します。パラメータタイプには明らかに問題があります。 – Kamo

+0

ありがとう、私はそれを変更しました:return(T)typeof(T).GetField(_name).GetValue(this);しかし、まだ喜んではありません – inadequateMonkey

関連する問題