我试图用已编译的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。如果要在方法中重构此代码,则类型将是一个参数。
答案 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();