2012-08-23 37 views
11

私は次のように3クラスを持っている:基本クラスのジェネリック型パラメータを取得する方法は?

public class TestEntity { } 

public class BaseClass<TEntity> { } 

public class DerivedClass : BaseClass<TestEntity> { } 

私はすでにランタイムでの反射を利用してDerivedClassSystem.Typeオブジェクトを取得します。反射を使用してオブジェクトをTestEntityにするにはどうすればよいですか?

ありがとうございました。

答えて

19

あなたのコードは単なるサンプルであり、DerivedClassを明示的に知らないと仮定します。

var type = GetSomeType(); 
var innerType = type.BaseType.GetGenericArguments()[0]; 

このコードは、あなたが扱うタイプのあなたはそれがあることを期待するものである場合は、確認する必要があり、実行時に非常に簡単に失敗する可能性があること注:

if(type.BaseType.IsGenericType 
    && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>)) 

また深い継承ツリーはので、いくつかのループが存在することができ上記の条件が必要となります。

+0

私は動的にDerivedClassのタイプのオブジェクトを取得するので、ハードコーディングすることはできません。私は解決しました。 – lucn

+0

スタブがある 'DerivedClass'をハードコードしていませんでした' var type = GetSomeType(); – Rafal

+0

はい、これは正しいです。 – lucn

0
var derivedType = typeof(DerivedClass); 
var baseClass = derivedType.BaseType; 
var genericType = baseClass.GetGenericArguments()[0]; 
0

これは動作するはずだと思う:

var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault(); 

それとも

var someObject = new DerivedClass(); 
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault(); 
2

あなたはBaseTypeプロパティを使用することができます。次のコードは、(あなたが途中で別のクラスを追加し、例えば場合)相続の変化のための弾力性のようになります。

Type GetBaseType(Type type) 
{ 
    while (type.BaseType != null) 
    { 
     type = type.BaseType; 
     if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(BaseClass<>)) 
     { 
      return type.GetGenericArguments()[0]; 
     } 
    } 
    throw new InvalidOperationException("Base type was not found"); 
} 

// to use: 
GetBaseType(typeof(DerivedClass)) 
関連する問題