用已编译的lambda替换Activator.CreateInstance

时间:2014-09-30 09:42:29

标签: c# .net-3.5

我试图用已编译的lambda替换对Activator.CreateInstance(string,string)的调用。

我在这里或网上看到了大量的样本,但这种类型在编译时总是知道的。在我的cas中它不是,调用代码和类型位于不同的库中。

原始源代码如下:

    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();

错误是&#39;构造函数&#39;是一个变量&#39;但是像“&#39;方法”一样使用。

任何帮助表示感谢。

更新1 :此处的目标是使用最快的代码。当然我会缓存已编译的lambda。如果要在方法中重构此代码,则类型将是一个参数。

2 个答案:

答案 0 :(得分:0)

以下可能有效:

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

答案 1 :(得分:0)

您的问题是Compile()返回一个简单的Delegate类型,因为它可以返回任何类型的委托。既然您确切地知道它将返回什么类型,您可以简单地将委托转换为正确的类型并使用它:

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