【发布时间】:2010-03-16 00:07:07
【问题描述】:
我想创建一个我在我拥有的泛型方法中指定的类型的实例。这种类型有许多重载的构造函数。我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
不认为有这个选项。
还有其他方法吗?
【问题讨论】:
标签: c# generics createinstance
我想创建一个我在我拥有的泛型方法中指定的类型的实例。这种类型有许多重载的构造函数。我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
不认为有这个选项。
还有其他方法吗?
【问题讨论】:
标签: c# generics createinstance
(T)Activator.CreateInstance(typeof(T), param1, param2);
【讨论】:
还有另一种通过命名参数将参数传递给 CreateInstance 的方法。
基于此,您可以将数组传递给CreateInstance。这将允许您有 0 个或多个参数。
public T CreateInstance<T>(params object[] paramArray)
{
return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
【讨论】:
请记住,尽管在 Activator.CreateInstance 上传递参数与无参数创建相比具有显着的性能差异。
使用预编译的 lambda 动态创建对象有更好的选择。当然,性能总是主观的,它是否值得显然取决于每种情况。
Details about the issue on this article.
图表取自文章,表示每 1000 次调用所花费的时间(以毫秒为单位)。
【讨论】:
Activator.CreateInstance 的参数化构造函数的每次调用将花费 0.0035ms(或 3.5 微秒) - 取决于您的应用程序甚至可能根本不会在性能测试中注册。
作为 Activator.CreateInstance 的替代方案,链接 url 中的 FastObjectFactory 的性能优于 Activator(从 .NET 4.0 开始,明显优于 .NET 3.5。没有使用 .NET 4.5 进行测试/统计)。有关统计信息、信息和代码,请参阅 StackOverflow 帖子:
How to pass ctor args in Activator.CreateInstance or use IL?
【讨论】:
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;
}
}
【讨论】: