繁体   English   中英

用于创建Ironpython类的Activator.CreateInstance

[英]Activator.CreateInstance for create Ironpython class

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

谢谢!

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

您可以创建此类的实例

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在大多数情况下...

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

假设您使用Activator.CreateInstance的重载仅接受Type参数,则您的类的构造函数必须接受零参数。

如果您坚持使用仅带有 Type参数的Activator.CreateInstance的重载,而不是使用将对象集合作为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因为它的性能Activator.CreateInstance ,它现在比以前的C#/ .NET版本要好一些。 @SchlaWiener的答案包含有关此的更多信息。

这个问题,也可能与您的问题有关。 Activator.CreateInstance性能替代

暂无
暂无

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

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