Activator.CreateInstance 用于创建 Ironpython class

Activator.CreateInstance for create Ironpython class

是否可以使用 Activator.CreateInstance 根据 Ironpython 中声明的类型在 c# 中创建 class?如果我尝试使用它,我总是会收到消息,即找不到无参数构造函数。

谢谢!

假设您使用 Activator.CreateInstance 的重载只接受 Type 参数,您的 class 必须有一个接受 零参数的构造函数。

如果您坚持使用仅接受 Type 参数的 Activator.CreateInstance 重载,而不是例如 overload that takes a collection of objects as args,那么您必须实现无参数构造函数。

示例:

public class MyClass
{
    public MyClass() // <-- parameterless constructor
    {
    }
}

如果 class 不是您代码的一部分,或者在您无法控制源代码的库中。那么你也许可以继承 class,前提是基础 class 不是 sealed,然后将 parameterless constructor 添加到派生的 class.

示例:

public class MyClass : SomeBaseClassYouDontControl
{
    public MyClass() : base(null) // <-- still a parameterless constructor
    {
    }
}

但是,我 建议反对 使用 Activator.CreateInstance 因为它的性能很糟糕,现在比以前版本的 C# / .NET 好一点。 @SchlaWiener 的回答包含更多关于此的信息。

这个问题,可能也与你的问题有关。 Activator.CreateInstance Performance Alternative

Activator.CreateInstance 有很多重载。您应该使用需要类型的重载和属性的附加对象数组

您可以创建此 class

的实例
public class MyClass
{
    public MyClass(int _int, string _string, bool _bool)
    {
    }
}

Activator.CreateInstance(typeof(MyClass), new object[] { 1, "string", true });

正如 die maus 所说,Activator.CreateInstance 与其他解决方案相比可能较慢。但这完全取决于你想做什么。如果你想构建一个依赖注入框架,我建议你使用替代方法。如果你想在运行时创建一个类型,不管它需要 3 毫秒还是 15 毫秒,你应该没问题。

我写了一个快速基准:

        var sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        for (int i = 0; i < 100000; i++)
        {
            var file = new System.IO.FileInfo(@"c:\temp\file");
        }
        var t1 = sw.ElapsedMilliseconds;

        var args = new object [] { @"c:\temp\file" };
        sw.Restart();
        for (int i = 0; i < 100000; i++)
        {
            var file = Activator.CreateInstance(typeof(System.IO.FileInfo), args);
        }
        var t2 = sw.ElapsedMilliseconds;
        Console.WriteLine("t1: {0}", t1);
        Console.WriteLine("t2: {0}", t2);

输出:

t1: 466
t2: 1246

在大多数情况下我不会考虑这个huge...

简短的回答,不,这是不可能的。