2013-09-14 3 views
5

Рассмотрим этот код:Создание экземпляра из класса в C# с помощью отражения

class Program 
{ 
    static void Main(string[] args) 
    { 
     var instance = Activator.CreateInstance<Person>();//No parameterless constructor defined for this object. 

    } 
} 

public class Person 
{ 
    public Person(string name = "Shahrooz") { } 
} 

При использовании этого кода: Activator.CreateInstance<Person>(); я получаю эту ошибку:

No parameterless constructor defined for this object.

Обратите внимание, что мой конструктор имеет параметр по умолчанию: строку name = "Shahrooz"

Почему мы не можем создать экземпляр из класса с конструктором, несмотря на то, что конструктор имеет параметр значения ошибки?

ответ

7

Мы не можем создать экземпляр из класса с конструктором, потому что конструктору по-прежнему нужен один параметр, даже если он по умолчанию. Вы можете получить значение по умолчанию, хотя, по телефону GetParameters() и доступа к начальному элементу:

ConstructorInfo constr = typeof(Person).GetConstructor(new[] {typeof(string)}); 
ParameterInfo p0 = constr.GetParameters()[0]; 
object defaultValue = p0.DefaultValue; 
Person p = (Person)constr.Invoke(new[] {defaultValue}); 
// ...or using Activator 
Person p = (Person)Activator.CreateInstance(typeof(Person), defaultValue); 
+2

Но почему мы можем создать с помощью этого кода: объект O = Activator.CreateInstance (TypeOf (Person), «Али»); –

+1

, потому что для этого метода требуется массив объектов/параметров –

+1

@ShahroozJefri ㇱ Вы можете это сделать, потому что вы явно передаете параметр. Общая версия 'Create ' требует конструктора без параметров, который не совпадает с конструктором, и все его параметры по умолчанию будут иметь некоторые значения. – dasblinkenlight

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