繁体   English   中英

如何将参数传递给 Activator.CreateInstance<T> ()

[英]How to Pass Parameters to Activator.CreateInstance<T>()

我想创建一个我在我拥有的泛型方法中指定的类型的实例。 这种类型有许多重载的构造函数。 我希望能够将参数传递给构造函数,但是

Activator.CreateInstance<T>()

不认为有这个选项。

还有另一种方法吗?

是的。

(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 动态创建对象有更好的选择。 当然,性能始终是主观的,它显然取决于每种情况是否值得。

关于本文问题的详细信息。

图表取自文章,表示每 1000 次调用所花费的时间(以毫秒为单位)。

性能对比

作为 Activator.CreateInstance 的替代方案,链接 url 中的 FastObjectFactory 比 Activator 更好(从 .NET 4.0 开始,明显优于 .NET 3.5。没有使用 .NET 4.5 完成测试/统计)。 有关统计信息、信息和代码,请参阅 StackOverflow 帖子:

如何在 Activator.CreateInstance 中传递 ctor args 或使用 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM