我想创建我在已有的泛型方法中指定的类型的实例。此类型有许多重载构造函数。我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
他不认为这是一个选择。
还有别的办法吗?
我想创建我在已有的泛型方法中指定的类型的实例。此类型有许多重载构造函数。我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
他不认为这是一个选择。
还有别的办法吗?
当前回答
public class AssemblyLoader<T> where T:class
{
public void(){
var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll")
}
public T Load(string assemblyFile, string objectToInstantiate)
{
var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();
return loaded as T;
}
}
其他回答
作为活化剂的替代品。链接url中的CreateInstance、FastObjectFactory比Activator更好(从。net 4.0开始,明显优于。net 3.5。. net 4.5没有测试/统计)。查看StackOverflow的统计,信息和代码:
如何在激活器中传递参数。CreateInstance或使用IL?
Yes.
(T)Activator.CreateInstance(typeof(T), param1, param2);
记住Activator传递的参数。CreateInstance与无参数创建相比具有显著的性能差异。
使用预编译的lambda动态创建对象有更好的替代方案。当然,表现总是主观的,它显然取决于每个情况,如果它值得或不值得。
关于本文问题的详细信息。
图表取自文章,表示每1000次调用所花费的时间(毫秒)。
还有另一种方法通过命名参数将参数传递给CreateInstance。
基于此,您可以将一个数组传递给CreateInstance。这将允许您拥有0个或多个参数。
public T CreateInstance<T>(params object[] paramArray)
{
return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
public class AssemblyLoader<T> where T:class
{
public void(){
var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll")
}
public T Load(string assemblyFile, string objectToInstantiate)
{
var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();
return loaded as T;
}
}