簡體   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