私はこれが古い質問であることを知っていますが、承認された回答はあまり役に立ちません。フレームワークによって提供される文字列の平等性を比較する必要はありませんでした。なぜなら、ある時点でアプリケーションが変更された場合、アプリケーションが故障するからです。
したがって、実行時に独自の型を構築するさらに複雑なシステムを作成したので、このスレッドに20セントを追加しましょう。
TypeBuilderInstantiation
は常に少なくとも一つTypeBuilder
し、他のインスタンスType
の(RuntimeType
、TypeBuilder
及び/又はTypeBuilderInstantiation
)からなる一般的なタイプの表現です。これは、問題の型の汎用型定義がTypeBuilder
であるか、または汎用引数の少なくとも1つがTypeBuilder
、GenericTypeParameterBuilder
またはそれ自身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;
}
あなたはそのインスタンスをどのように保持しますか?また、TypeBuilder.GetMethodsは、作成されていなければ、例外をスローします。あなたは何をしようとしているのですか? – leppie