2011-01-19 5 views
1

TypeオブジェクトがTypeBuilderInstantiationであるかどうかを確認するにはどうすればよいですか?TypeがTypeBuilderであるかどうかをチェック

基本的に、タイプオフのメソッドが必要です。

TypeBuilderInstantiationの場合は、theType.GetMethod(...)に限らず、TypeBuilder.GetMethod(...)に電話する必要があります(サポートされていない例外がスローされるため)。

TypeBuilderInstantiationがタイプ(TypeBuilderではない)から直接継承するため、タイプがTypeBuilderであるかどうかを単純に確認することはできません。内部であるため、TypeBuilderInstantiationと直接確認することはできません。

+0

あなたはそのインスタンスをどのように保持しますか?また、TypeBuilder.GetMethodsは、作成されていなければ、例外をスローします。あなたは何をしようとしているのですか? – leppie

答えて

2

Type.FullnameTypeBuilderInstantiationの予想とを比較してみませんか?

これは悪いです。あなたは、あなたが内部のクラスでぶち壊していることを詳しく説明できますか?

+0

CreateTypeが呼び出される前に型パラメータをTypeBuilderに適用すると、TypeBuilderInstantiationのインスタンスが返されると思いますが、それは誰でも推測できます。 – leppie

+0

これは正しいレッピーです。私は何かでうんざりしていません。私はちょうど2つの異なる型を生成しており、他の型のメソッドを呼び出す必要があります....しかし、実行時にもう一方が既に作成されているかどうかはわかりません。 – Jeff

+0

私は完全にこれをやらなければなりませんでした。私は 'StartsWith(" TypeBuilder ")'を探しています。ちょっと脆弱ですが、実行時に型のように見える内部型のM $ TypeBuilderのように動作します – jbtule

0

私はこれが古い質問であることを知っていますが、承認された回答はあまり役に立ちません。フレームワークによって提供される文字列の平等性を比較する必要はありませんでした。なぜなら、ある時点でアプリケーションが変更された場合、アプリケーションが故障するからです。

したがって、実行時に独自の型を構築するさらに複雑なシステムを作成したので、このスレッドに20セントを追加しましょう。

TypeBuilderInstantiationは常に少なくとも一つTypeBuilderし、他のインスタンスTypeの(RuntimeTypeTypeBuilder及び/又はTypeBuilderInstantiation)からなる一般的なタイプの表現です。これは、問題の型の汎用型定義がTypeBuilderであるか、または汎用引数の少なくとも1つがTypeBuilderGenericTypeParameterBuilderまたはそれ自身TypeBuilderInstantiationであることを意味します。 (それはジェネリック型自体によって宣言された場合GenericTypeParameterBuilderの場合、それはカウントされません。)

はここTypeBuilderInstantiationのインスタンスを取得する方法の例です:ここでは

AssemblyName myAssemblyName = new AssemblyName("MyAssembly"); 
AssemblyBuilder myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run); 
ModuleBuilder myModule = myAssembly.DefineDynamicModule("MyModule"); 
TypeBuilder myType = myModule.DefineType("MyType"); 
//myType (MyType) is TypeBuilder 
Type collectionType = typeof(Collection<>).MakeGenericType(myType); 
//collectionType (Collection<MyType>) is TypeBuilderInstantiation 

TypeBuilder myGenericType = myModule.DefineType("MyGenericType"); 
GenericTypeParameterBuilder myGenericParam = myGenericType.DefineGenericParameters("T")[0]; 
//myGenericType (MyGenericType<T>) is TypeBuilder 
Type genericType = myType.MakeGenericType(typeof(string)); 
//genericType (MyGenericType<string>) is TypeBuilderInstantiation 

TypeBuilder myOtherGenericType = myModule.DefineType("MyOtherGenericType"); 
GenericTypeParameterBuilder myOtherGenericParam = myOtherGenericType.DefineGenericParameters("S")[0]; 
Type otherGenericType = myType.MakeGenericType(myOtherGenericParam); 
//otherGenericType (MyGenericType<S>) is TypeBuilderInstantiation 

かどうかを確認するために気の利いた小さな実装ですタイプはTypeBuilderInstantiationです。

public static bool IsTypeBuilderInstantiation(Type type) 
{ 
    bool isTypeBuilderInstantiation = false; 
    if (type.IsGenericType && !(type is TypeBuilder)) 
    { 
     foreach (var genericTypeArg in type.GetGenericArguments()) 
     { 
      if (isTypeBuilderInstantiation = (
       genericTypeArg is TypeBuilder || 
       genericTypeArg is GenericTypeParameterBuilder || 
       IsTypeBuilderInstantiation(genericTypeArg))) 
       break; 
     } 
     isTypeBuilderInstantiation |= type.GetGenericTypeDefinition() is TypeBuilder; 
    } 
    return isTypeBuilderInstantiation; 
} 
関連する問題