9

次のクラスについて考えてみます。

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

次に、次のような別のクラスがあります。

public class AnotherClass<T>
   where T : ISomeInterface
{

}

私がインスタンス化するもの:

AnotherClass<AClass> genericClass = new  AnotherClass<AClass>();

AClassの具体的なインスタンスがなくても、genericClass内からAClass.APropertyの静的な値を取得するにはどうすればよいですか?

4

3 に答える 3

11

何かのようなもの

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

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

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

あなたがの中AnotherClass<T>にいるならT = AClass、あなたはそれを次のように参照することができますT

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

Tこれは、静的プロパティがあることが確実にわかっている場合に機能しますAProperty。そのようなプロパティがいずれかに存在するという保証がない場合はT、途中で戻り値/例外を確認する必要があります。

AClassあなたにとって興味深いだけなら、あなたは次のようなものを使うことができます

if (typeof(T) == typeof(AClass))
    n = AClass.AProperty;
else
    ???
于 2012-06-22T14:10:14.903 に答える
1

まず、AnotherClassインスタンスのジェネリックタイプを取得します。

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

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

// 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);
    }
}

もちろん、「AProperty」が存在することを保証することはできないことを認識しました。インターフェースは静的署名では機能しないISomeInterfaceため、ソリューションとは無関係であるとして削除しました。

于 2012-06-22T14:14:20.237 に答える
0

必要なフラグをバインドしていることを確認して くださいhttp://msdn.microsoft.com/en-us/library/system.reflection.bindingflags

于 2012-06-22T14:37:58.960 に答える