2012-06-22 13 views
9

は、次のクラスを考えてみましょう:どのように具体的なインスタンスなしタイプの静的プロパティの値を取得するためにリフレクションを使用することができます

public class AClass : ISomeInterface 
{ 
    public static int AProperty 
    { 
    get { return 100; } 
    } 
} 

次のように私はその後、別のクラスを持っている:

public class AnotherClass<T> 
    where T : ISomeInterface 
{ 

} 

どのインスタンスを介して私は:

どのように私のgenericClass内からAClass.APropertyの静的な値を取得できますかAClassの具体的なインスタンスを持たないで?

typeof(AClass).GetProperty("AProperty").GetValue(null, null) 

ような何かを行います

答えて

10

intにキャストすることを忘れないでください。

ドキュメントリンク:http://msdn.microsoft.com/en-us/library/b05d59ty.aspx(静的なプロパティもあります)しかし、正確にAClassがわかっている場合は、AClass.APropertyを使用してください。

あなたがT = AClassためAnotherClass<T>内にある場合は、Tとしてそれを参照することができます。

typeof(T).GetProperty("AProperty").GetValue(null, null) 

あなたのTは、静的プロパティAPropertyを持っていることを確実に知る場合、これは動作します。そのようなプロパティがTに存在するという保証がない場合、途中で戻り値/例外をチェックする必要があります。

だけAClassはあなたAnotherClassインスタンスのジェネリック型を取得

if (typeof(T) == typeof(AClass)) 
    n = AClass.AProperty; 
else 
    ??? 
+0

グレートたいフラグを結合していることを確認してください。私が今発見した唯一の問題は、インタフェースで静的プロパティを定義することができないことです。私は、静的でないプロパティと同じ値を返す静的なプロパティを追加することができたと思います.1つはインスタンスを使用し、もう1つはその型を参照していますか?それとも別の方法がありますか? –

+0

また、私は新しいT()を使って非静的なプロパティを取得することもできます。AProperty、これは悪い習慣のようです。どう思いますか? –

+0

@Stewart:新しい 'T'を作るのは高価かもしれません。インターフェイスに静的なものは含まれていないのは残念です。 – Vlad

1

ファーストのようなものを使用することができ、あなたのための興味深いの場合。

次に、静的プロパティを取得します。

次に、プロパティの静的値を取得します。インターフェースは、静的署名に動作しないので、「AProperty」が存在することを保証することは不可能であることを、もちろん、認識

// I made this sealed to ensure that `this.GetType()` will always be a generic 
// type of `AnotherClass<>`. 
public sealed class AnotherClass<T> 
{ 
    public AnotherClass(){ 
     var aPropertyValue = ((PropertyInfo) 
       this.GetType() 
        .GetGenericArguments()[0] 
        .GetMember("AProperty")[0]) 
      .GetValue(null, null); 
    } 
} 

、Iは溶液とは無関係であるとしてISomeInterfaceを除去します。

関連する問題