Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CreateIronPython类的Activator.CreateInstance_C#_.net_Instance_Ironpython_Activator - Fatal编程技术网

C# CreateIronPython类的Activator.CreateInstance

C# CreateIronPython类的Activator.CreateInstance,c#,.net,instance,ironpython,activator,C#,.net,Instance,Ironpython,Activator,是否可以使用Activator.CreateInstance根据Ironpython中声明的类型在c中创建类?如果我尝试使用它,我总是得到这样一条消息:没有找到无参数构造函数 谢谢大家! 假设您使用Activator.CreateInstance的重载只接受Typeargument,那么您的类必须有一个接受零参数的构造函数 如果您坚持使用Activator.CreateInstance的重载,它只接受类型参数,而不是实例,那么您必须实现一个无参数构造函数 例如: public class MyC

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


谢谢大家!

假设您使用Activator.CreateInstance的重载只接受Typeargument,那么您的类必须有一个接受零参数的构造函数

如果您坚持使用Activator.CreateInstance的重载,它只接受类型参数,而不是实例,那么您必须实现一个无参数构造函数

例如:

public class MyClass
{
    public MyClass() // <-- parameterless constructor
    {
    }
}
public class MyClass : SomeBaseClassYouDontControl
{
    public MyClass() : base(null) // <-- still a parameterless constructor
    {
    }
}
但是,我建议不要使用Activator.CreateInstance,因为它的性能很差,现在比以前的C/.NET版本要好一些@Schlaviener的回答包含了更多关于这方面的信息


这个问题,可能也和你的问题有关

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

您可以创建此类的实例

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

正如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);

在大多数情况下,我不认为这是巨大的……

简短的回答,不可能。

@ VEVEKE我不明白你的意思。只有一个参数更少的构造函数,这就是为什么我很困惑。没有什么可以说……你的类必须有一个零参数的构造函数。我假设OP使用的Activator.CreateInstance的重载只接受类型参数,那该如何处理呢。但我会在我的帖子中添加信息。实际上,您可以省略新对象[]{1,string,true},只需将参数指定为。。。仅此而已,因为args参数是params参数。Activator.CreateInstanceTypeOfCyclass,1,字符串,true;谢谢,但是:1。我没有参数。2.这场演出不对劲。3.我使用dlr类,这似乎是problem@BendEg-错误消息“找不到无参数构造函数”非常清楚。也许您可以发布一些示例代码或查看type.getconstructor,以了解您的类有哪些.ctor。
        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