2013-06-10 9 views
7
[Name("Admin")] 
public class TestAdmin : TestUserBase<TestAdmin> 
{ 
    public TestAdmin(Type webDriverType) : base(webDriverType) 
    { 
    } 
} 

현재이 양식의 클래스는 Reflection.Emit을 사용하여 런타임에 만들고 싶습니다. 그러나, 나는 내가 부모를 추가하려고 문제로 실행 해요 -을 TestAdmin 클래스는 런타임 이전에 존재하지 않기 때문에, 나는유형을 Reflection.Emit의 유형 매개 변수로 사용하기

TestUserBase<TestAdmin> 

어떤 아이디어를 만드는 방법을 몰라?

TypeBuilder tb = mb.DefineType("TestAdmin", TypeAttributes.Public); 
tb.SetParent(typeof(TestUserBase<>).MakeGenericType(tb)); 

Type theType = tb.CreateType(); 
+0

기본 제네릭 클래스에 대한 인수가 * this * 클래스이기 때문에 특별히 문제가 있습니까? –

+0

나는 닭고기와 달걀 문제가 있다고 생각한다. C# 컴파일러는 IL을 생성하기 위해 Reflection.Emit을 사용하지 않았기 때문에 가능할 수도있다. 이 문제에 대한 해결책이 있는지 확실하지 않습니다 ... –

+0

make-generic-method가 유형 작성기를 허용합니까? 실제로, 나는 고투하는 닭고기/계란이 나는 까닭을 기억하고 있습니다. 최근에 나는 reflection-emit과 같은 api를 가진 IKVM-reflection을 사용하고 있지만, 많은 부분을 수정했다. –

답변

7

당신은 SetParent를 사용하여 부모 타입을 설정할 수 있습니다. 나는 이것을 철저히 시험 할 수 없었지만 이것이 가능하다고 생각한다. 이런 식으로 뭔가를 시도 : TestUserBase<T>를하면, 물론

var emittedType = module.DefineType("TestAdmin", TypeAttributes.Public | TypeAttributes.Class); 
var baseType = typeof(TestUserBase<>).MakeGenericType(type); 
emittedType.SetParent(baseType); 

:

(즉, 당신이 TestUserBase<T>를 생성하지 않는) 당신의 일반적인 기본 클래스가 이미 정의되어 가정 할 때, 당신은 이런 식으로 뭔가를 할 수 있어야한다 가 생성되기 시작하면 동적 유형 TestUserBase<T>에서 MakeGenericType을 사용하여이 동일한 논리를 사용할 수 있습니다. SetParent 논리는 동일합니다.

+0

신난다, 고마워! 이것은 내가 필요한 것처럼 보입니다. –

3

OK :

관련 문제