2014-09-30 3 views
0

Activator.CreateInstance (string, string)에 대한 호출을 컴파일 된 람다로 바꾸려고합니다.Activator.CreateInstance를 컴파일 된 람다로 바꾸기

여기 또는 웹에서 많은 샘플을 볼 수 있지만 유형은 항상 컴파일 된 시간에 알려집니다. 내 캐쉬에서는 호출 코드와 유형이 별도의 라이브러리에 있습니다.

System.Windows.Window myObject= 
     (System.Windows.Window)Activator.CreateInstance("MyLibrary", "MyLibrary.MyType") 
     .Unwrap(); 

중요 사항 :

원래의 소스 코드

는 다음과합니다 MyType은 항상 System.Windows.Window에서 유래.

나는 컴파일되지 않습니다 다음 코드로 붙어 :

Type receptionPanelViewType = Type.GetType("MyLibrary.MyType,MyLibrary"); 
ConstructorInfo ctor = receptionPanelViewType.GetConstructor(Type.EmptyTypes); 

var delegateType = typeof(Func<System.Windows.Window>).MakeGenericType(receptionPanelViewType); 
var lambda = System.Linq.Expressions.Expression.Lambda(delegateType, System.Linq.Expressions.Expression.New(ctor)); 
var constructor = lambda.Compile(); 
System.Windows.Window receptionPanelView = constructor(); 

오류는 '생성자'입니다 '변수'이지만 '방법'처럼 사용된다.

도움을 주시면 감사하겠습니다.

업데이트 1 : 목표는 가장 빠른 코드를 사용하는 것입니다. 물론 컴파일 된 람다를 캐시 할 것입니다. 메서드에서이 코드를 리팩터링하는 경우 매개 변수가됩니다.

+1

실제로 더 간단하고 읽기 쉬운 코드를 사용하고 싶지 않은 이유는 무엇입니까? 공장? –

+0

그 개체를 만드는 가장 빠른 방법이 필요합니다. 질문이 업데이트되었습니다. –

답변

0

다음은 아마 작동합니다 :

var receptionPanelView = constructor.DynamicInvoke() as System.Windows.Window; 
+1

성능상의 이유로? –

+0

람다 표현식은 반복적으로 사용하면 반복 된 사용으로 더 나은 성능을 얻을 수 있습니다. 필자는 대답을 업데이트 할 것입니다. – decPL

+0

물론 작동합니다. –

0

귀하의 문제는 위임의 어떤 종류를 반환 할 수 있기 때문에 Compile() 간단한 Delegate 형식을 반환하는 것입니다. 어떤 형식으로 반환할지 정확히 알기 때문에 대리자를 올바른 형식으로 캐스팅하고 다음과 같이 사용하면됩니다.

var constructor = (Func<System.Windows.Window>) lambda.Compile(); 
System.Windows.Window receptionPanelView = constructor(); 
+1

내가 잘못되었을 수도 있지만 괜찮아요 컴파일하지만 런타임에 예외가 throw됩니다. 'System.Func'1 [System.Func'1 [System.Windows.Window]'를 입력하려면 'System.Func'1 [MyLibrary.MyType]'유형의 객체를 캐스팅 할 수 없습니다. . –