使用反射在C#中从类创建实例

5

请考虑以下代码:

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>();时,出现了以下错误:

没有为此对象定义无参数的构造函数。

需要注意的是,我的构造函数有默认参数:string name = "Shahrooz"

尽管构造函数有默认值参数,为什么我们不能创建具有构造函数的类的实例呢?

1个回答

8
由于构造函数仍然需要一个参数,即使它是默认值,因此我们无法从具有构造函数的类中创建实例。但是,您可以通过调用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
但是为什么我们可以通过这段代码创建对象:object o = Activator.CreateInstance(typeof(Person), "Ali"); - user1968030
1
因为该方法需要对象/参数数组。 - Karel Frajták
1
@ShahroozJefriㇱ你可以这样做,因为你明确地传递了参数。Create<T>的通用版本需要一个无参构造函数,这与所有参数都默认为某些值的构造函数不同。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接