Activator.CreateInstance用于创建Ironpython类

时间:2015-03-24 15:56:04

标签: c# .net instance ironpython activator

是否可以使用Activator.CreateInstance根据Ironpython中声明的Type在c#中创建一个类?如果我尝试使用它,我总是得到消息,没有找到无参数构造函数。

谢谢!

3 个答案:

答案 0 :(得分:1)

Activator.CreateInstance有很多重载。您应该使用需要Type和adition对象数组的重载来实现属性

您可以创建此类的实例

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 ...

答案 1 :(得分:0)

答案简短,不可能。

答案 2 :(得分:-1)

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

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

示例:

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

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

示例:

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

但是,我会使用Activator.CreateInstance 建议,因为它的性能很差,现在比以前版本的C#/ .NET好一点。 @ SchlaWiener的答案包含更多有关此内容的信息。

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