2017-06-21 18 views
0

ランタイムにクラスを作成していますが、タイプのいくつかはすでにModuleBuilder内に作成されています。再利用したいのですが、TypeBuilderはありません。それを変更する必要があります)TypeからTypeBuilderに変換

TypeからTypeBuilderに変換する方法はありますか?

Type moduleType = ModuleBuilder.GetType(inXmlTemplateProperty.PropertyName); 
     if (moduleType == null) 
     { 
      TypeBuilder newClass = ModuleBuilder.DefineType(inXmlTemplateProperty.PropertyName, 
                  TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Serializable); 

      newClass.SetClassAttributes(inXmlTemplateProperty); 

      return newClass; 
     } 

     return (TypeBuilder)moduleType; 

事前に感謝の意を表します。

答えて

0

TypeBuilderは、派生型のType(中間クラスTypeInfo経由)です。

TypeBuilderを型にキャストできます。しかし、それ以外の方法ではありません。

最も一般的な抽象レベル(タイプ)を使用する必要があります。

moduleTypeをTypeBuilderにキャストしないでください。 その後、あなたはそのようなコードを使用して、タイプが既に作成されたかどうチェックすることができるようになります:

class Program 
{ 
    private static Type GetSomeTypePending(string typeName) 
    { 
     AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("toto.dll"), AssemblyBuilderAccess.RunAndSave); 
     ModuleBuilder mb = ab.DefineDynamicModule("toto.dll"); 
     TypeBuilder tb = mb.DefineType(typeName); 
     return tb; 
    } 

    private static Type GetSomeTypeCreated(string typeName) 
    { 
     AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("toto.dll"), AssemblyBuilderAccess.RunAndSave); 
     ModuleBuilder mb = ab.DefineDynamicModule("toto.dll"); 
     TypeBuilder tb = mb.DefineType(typeName); 
     tb.CreateType(); // do not return the created type, 
     return tb;  // return the typebuilder 
    } 

    static void Main(string[] args) 
    { 
     Type foo = GetSomeTypePending("tutu"); 
     Type foo2 = GetSomeTypeCreated("tutu"); 
     if (IsPendingTypeBuilder(foo)) 
     { 
      Console.WriteLine("foo not yet created"); 
     } 
     else 
     { 
      Console.WriteLine("foo created"); 
     } 
     if (IsPendingTypeBuilder(foo2)) 
     { 
      Console.WriteLine("foo2 not yet created"); 
     } 
     else 
     { 
      Console.WriteLine("foo2 created"); 
     } 
    } 

    private static bool IsPendingTypeBuilder(Type foo) 
    { 
     return (foo is TypeBuilder) && !((foo as TypeBuilder).IsCreated()); 
    } 
} 
+0

こんにちは、答えてくれてありがとう、私の最初の試みでしたが、悲しいことにInvalidCastExceptionがスローされました。 – Nekeniehl

+0

あなたの質問にマッチした –

0

種類のいくつかはすでにModuleBuilder内に作成されていると私は再利用したいと思いますそれら

できません。 TypeBuilder.CreateTypeに電話をかけると、そのタイプはフリーズします。 TypeBuilderへのアクセス権を取得できたとしても、そのタイプを変更することはできません。

関連する問題