【问题标题】:How to Pass Parameters to Activator.CreateInstance<T>()如何将参数传递给 Activator.CreateInstance<T>()
【发布时间】:2010-03-16 00:07:07
【问题描述】:

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

Activator.CreateInstance<T>()

不认为有这个选项。

还有其他方法吗?

【问题讨论】:

标签: c# generics createinstance


【解决方案1】:

Yes.

(T)Activator.CreateInstance(typeof(T), param1, param2);

【讨论】:

    【解决方案2】:

    还有另一种通过命名参数将参数传递给 CreateInstance 的方法。

    基于此,您可以将数组传递给CreateInstance。这将允许您有 0 个或多个参数。

    public T CreateInstance<T>(params object[] paramArray)
    {
      return (T)Activator.CreateInstance(typeof(T), args:paramArray);
    }
    

    【讨论】:

      【解决方案3】:

      请记住,尽管在 Activator.CreateInstance 上传递参数与无参数创建相比具有显着的性能差异。

      使用预编译的 lambda 动态创建对象有更好的选择。当然,性能总是主观的,它是否值得显然取决于每种情况。

      Details about the issue on this article.

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

      【讨论】:

      • 对于上下文,此图表意味着(平均而言,在同一硬件上)使用 Activator.CreateInstance 的参数化构造函数的每次调用将花费 0.0035ms(或 3.5 微秒) - 取决于您的应用程序甚至可能根本不会在性能测试中注册。
      【解决方案4】:

      作为 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?

      【讨论】:

      • 您的意思是,当您传递参数时,有一个替代解决方案(链接)可能比 Activator.CreateInstance 执行得更好?或者这可能在所有情况下都表现得更好?
      • 我已经有一段时间没有进行性能测试了,看起来有人发布了 .NET 4.0 统计信息,但是使用 .NET 4.0 看起来 FastObjectFactory 的性能更好。 Activator.CreateInstance 在 .NET 3.5 中很糟糕,在 .NET 4.0 中明显更快,但仍然比该 url 中链接的 FastObjectFactory 慢。
      【解决方案5】:
      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;
          }
      }
      

      【讨论】:

      • 这是无法解释的代码。我怀疑它是否有帮助甚至根本有效。为了说服我,请解释它是如何工作的以及为什么它应该解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多