我试图用已编译的lambda替换对Activator.CreateInstance(string,string)的调用。用已编译的lambda替换Activator.CreateInstance
我在这里或网上看到很多样本,但是编译时总是知道这个类型。在我的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();
的错误是“构造”是一个“变量”,而是使用类似“法”。
任何帮助表示赞赏。
UPDATE 1:这里的目标是使用最快的代码。当然,我会缓存编译的lambda。如果此代码要在方法中重构,则该类型将是一个参数。
为什么你不希望使用更简单,更易于阅读的代码,实际上作品? – 2014-09-30 09:48:42
因为我需要最快的方式来创建这些对象。问题已更新。 – 2014-09-30 13:54:57