2012-02-06 2 views
3

のクラス 利用型の一般的なタイプを取得します。私は、一般的なクラスという名前のMyGeneralClassを持っている:私は GetDataタイプ

public void GetData(Type type) { 



} 

を使用します。また、私は、私はそれを使用する必要がある別の方法をしている

public MyGeneralClass<T> { 

public List<T> Data {get; set;} 

} 

このように:

GetData(typeof(MyGeneralClass<person>)); 

私の質問はどのようにしてT(この例ではperson)のGetDataメソッドでは、GetDataのパラメータを変更できませんが、その実装を変更できます。どの人もこれについて考えていますか?反射によって

答えて

6

if(type.IsGenericType && 
    type.GetGenericTypeDefinition() == typeof(MyGeneralClass<>)) 
{ 
    Type firstArg = type.GetGenericArguments()[0]; 
} 
+0

+1です。 –

+0

'var myClass = new MyClass (); GetType(typeof(MyClass)); // type.IsGenericTypeはfalseです。 GetType(myClass.GetType()); // type.IsGenericTypeはtrueです。どうすればいいですか? –

+0

@MichalB 'MyClass'は' MyClass 'と完全に無関係です - ' MyClass'は非ジェネリック型です。 'MyClass <>'は* open *ジェネリック型です。 'MyClass 'は* closed *ジェネリックタイプ –

1

Type.GetGenericArgumentsはあなたの例では、一般的な引数の配列、すなわち、{person}を返します。あなたはその目的のためにGetGenericArgumentsを使用することができます

Type t = type.GetGenericArguments()[0]; 
2

あなたがGetGenericArgumentsメソッドを使用することができます。

Type[] genericArguments = type.GetGenericArguments(); 

この場合、Personがこの配列の最初の型になります。

1

1
typeof(MyGeneralClass<person>).GetGenericTypeDefinition()