用已编译的lambda替换Activator.CreateInstance

本文关键字:替换 Activator CreateInstance lambda 编译 | 更新日期: 2023-09-27 18:25:00

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

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

原始源代码如下:

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

重要提示:MyType ALWAYS派生自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();

错误为"constructor"是一个"variable",但使用方式与"method"类似。

感谢您的帮助。

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

用已编译的lambda替换Activator.CreateInstance

以下可能会起作用:

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

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

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