用已编译的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。如果要在方法中重构此代码,则类型将是一个参数。
以下可能会起作用:
var receptionPanelView = constructor.DynamicInvoke() as System.Windows.Window;
您的问题是Compile()
返回一个简单的Delegate
类型,因为它可以返回任何类型的委托。由于您确切地知道它将返回什么类型,因此您可以简单地将委托强制转换为正确的类型并使用它:
var constructor = (Func<System.Windows.Window>) lambda.Compile();
System.Windows.Window receptionPanelView = constructor();