2015-03-24 2 views
0

Возможно ли использовать Activator.CreateInstance для создания класса в C# на основе типа, объявленного в Ironpython? Если я пытаюсь использовать его, я всегда получаю сообщение, что конструктор без параметров не найден.Activator.CreateInstance для создания класса Ironpython

Спасибо!

+0

@Veverke, я не понимаю, что вы имеете в виду. – BendEg

+0

Существует только один параметр-Меньший конструктор, вот почему я так запутался. – BendEg

ответ

0

Короткий ответ, нет, это не возможное.

-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

+0

Нечего сказать «[...] ваш класс должен иметь конструктор, который принимает нулевые аргументы. »- как насчет [переопределения, которое принимает аргументы конструктора] (https://msdn.microsoft.com/en-us/library/wcxyzt4d%28v=vs.110%29 .aspx) – Jamiec

+0

Я предполагаю, что OP использует перегрузку Activator.CreateInstance, которая принимает только аргумент 'Type'. Но я добавлю информацию в свой пост. –

+0

Обновлен мой ответ. –

1

Activator.CreateInstance имеет много перегрузок. Вы должны использовать перегрузку, которая требует типа и массив объектов 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 в большинстве сценариев ...

+0

Вы действительно можете оставить« новый объект » [] {1, "string", true} 'и просто указать аргументы как ... именно так, поскольку аргумент' args' является параметром 'params'. Activator.CreateInstance (typeof (MyClass), 1 , "string", true); ' –

+0

Спасибо, но: 1. У меня нет параметра 2. Производительность не имеет значения 3. Я использую классы dlr, которые, кажется, являются проблемой – BendEg

+0

@BendEg - Сообщение об ошибке 'no parameter-less constructor found' довольно ясен. Возможно, вы можете опубликовать код примера или взглянуть на' type.Get Конструкторы() 'для определения того, что' .ctors' ваш класс. –

Смежные вопросы