2017-04-06 2 views
0

TypeBuilder을 사용하여 유형을 생성 중입니다. 이러한 유형은 제네릭 클래스의 인수로 사용됩니다. 내가하고 싶은 일은 그 이름으로 Type을 만드는 것입니다. generic 매개 변수가 동적이라는 사실은 장벽으로 보입니다. 분명히검색 유형 Foo <Bar> 이름에서 Bar를 만들 때 TypeBuilder

static public class DynamicTypeTest 
{ 
    public class Generic<T> { } 

    static public void Test() 
    { 
     Type dynamicType = createDynamicType(); 
     Type genericType = typeof(Generic<>); 

     // Generic<DynamicType> 
     Type genericDynamicType = genericType.MakeGenericType(new Type[]{dynamicType}); 

     Debug.Assert(TypeFromName(genericDynamicType.FullName) == genericDynamicType);    // fail 
     Debug.Assert(TypeFromName(genericDynamicType.AssemblyQualifiedName) == genericDynamicType); // fail 
     Debug.Assert(TypeFromName(genericDynamicType.Name) == genericDynamicType);     // fail 

     // Generic<int> 
     Type genericIntType = genericType.MakeGenericType(new Type[] { typeof(int) }); 

     Debug.Assert(TypeFromName(genericIntType.FullName) == genericIntType); // This succeeds. Replacing 'int' with a Type defined in another project also works 
    } 

    // This is the essence of what I want to do 
    static private Type TypeFromName(string name) 
    { 
     return Assembly.GetExecutingAssembly().GetType(name); 
    } 

    static private Type createDynamicType() 
    { 
     AssemblyName assemblyName = new AssemblyName("DynamicAssembly"); 
     AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); 
     ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule"); 
     TypeAttributes typeAttributes = TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass; 
     TypeBuilder typeBuilder = moduleBuilder.DefineType("DynamicType", typeAttributes, typeof(System.Object)); 

     return typeBuilder.CreateType(); 
    } 
} 

나는 MakeGenericType에서 Type을 만들 수 있지만, 내가 작업하고있는 실제 시나리오에서, 나는 싶지 않아 (또는 할 수없는) 형식 이름을 탈수하는 방법을 알고 난 할 수 있도록 별도로 유형을 작성하고 함께 조각하십시오.

string 이름에서 Type을 어떻게 다시 생성 할 수 있습니까?

+1

생성 된 유형은 'DynamicAssembly'라고하는 어셈블리에 있습니다. 맞습니까? 그렇다면 왜 어셈블리를 찾고 있습니까? –

+0

'Generic <>'은 실행중인 어셈블리에 있습니다. 또한 어셈블리 실행에서'Generic '을 검색한다. ('DynamicAssembly'의'Generic '가 작동하지 않습니다.) – AbleArcher

+0

'DynamicAssembly'와'Generic <>'의'DynamicType'을'ExecutingAssembly'에서 가져 오십시오. 'Generic <>'정적으로). 그런 다음'MakeGenericType'을 사용하여 그것들을 조합하십시오. –

답변

0

내가 실수로 Exception을 던지는 Assembly.GetType() 버전을 사용해야한다는 메시지가 나타났습니다. 그것은 FileNotFoundException을 던 졌으므로 일반 인자에서 파일의 어셈블리 만 허용됩니다. 이 문제를 해결하기 위해 AppDomain에서 AssemblyResolve 이벤트에 등록하고 파일에 DynamicAssembly이없는 경우를 처리했습니다. 제 작업 코드 :

관련 문제