C# 从抽象基类构造函数创建继承类的实例

C# 从抽象基类构造函数创建继承类的实例,c#,reflection,constructor,abstract-class,C#,Reflection,Constructor,Abstract Class,使用反射,是否可以使用抽象基类的构造函数创建从抽象基类继承的类型的实例?也就是说,继承类没有自己的构造函数吗?有点像下面,但它会抛出一个错误,因为您不能创建抽象类的实例,当然: abstract class PersonBase { string Name; public PersonBase(string _name) { Name = _name; } } class Person : PersonBase { } public static T GetPerso

使用反射,是否可以使用抽象基类的构造函数创建从抽象基类继承的类型的实例?也就是说,继承类没有自己的构造函数吗?有点像下面,但它会抛出一个错误,因为您不能创建抽象类的实例,当然:

abstract class PersonBase
{
     string Name;

     public PersonBase(string _name) { Name = _name; }
}

class Person : PersonBase
{

}

public static T GetPerson<T>(string name) where T : PersonBase, new()
{
   ConstructorInfo info = typeof(T).BaseType.GetConstructor(new Type[] 
                                                              { typeof(string) });

   object result = info.Invoke(new object[] { name }); 

   return (T)result;    
}
抽象类PersonBase
{
字符串名;
公共PersonBase(字符串_name){name=_name;}
}
班级人员:PersonBase
{
}
公共静态T GetPerson(字符串名),其中T:PersonBase,new()
{
ConstructorInfo=typeof(T).BaseType.GetConstructor(新类型[])
{typeof(string)});
对象结果=info.Invoke(新对象[]{name});
返回(T)结果;
}

您可以通过执行新的T{(此处指定属性)}来实现这一点,但这当然不是构造函数,而且属性必须是公共的,等等。

调用抽象类构造函数(无论是否通过反射)的唯一合法位置是在派生类的构造函数中。所以不,正如您所说,您将创建抽象类型的实例,而不是具体类型的实例。想象一下,如果抽象类有一个抽象方法,并且您对构造函数返回的任何内容都调用了它——那会做什么

如果你能给我们更多关于你努力实现目标的信息,我们也许能为你提供更多帮助


(您当前的示例甚至无法编译,因为默认的
Person
构造函数没有可调用的无参数基类构造函数。)

调用抽象类构造函数(无论是否通过反射)唯一合法的位置是在派生类的构造函数中。所以不,正如您所说,您将创建抽象类型的实例,而不是具体类型的实例。想象一下,如果抽象类有一个抽象方法,并且您对构造函数返回的任何内容都调用了它——那会做什么

如果你能给我们更多关于你努力实现目标的信息,我们也许能为你提供更多帮助


(您当前的示例甚至不会编译,因为默认的
Person
构造函数没有无参数基类构造函数可调用。)

通常这被视为a的基本情况。通常这被视为a的基本情况。我正在创建一个具有只读成员的抽象不可变类型。我希望这个通用的“Get”方法能够使用基构造函数获取从该抽象类型派生的任何类的实例。由于其不可变,因此必须在构造函数中分配成员。如果可能的话,不要让继承类型有构造函数。但是我会用另一种方法。@Sean:你不能创建一个除了静态类之外没有构造函数的类型(除了
对象
),也不能创建一个抽象类的实例。你可以创建一个只有公共属性的类,并像这样初始化它:new Foo{Property1=x,Property2=x}。我想那个类仍然有一个默认的无参数构造函数。我想我是说除了默认构造函数之外没有其他构造函数。无论如何,只读属性不能以这种方式初始化。@Sean:这调用了无参数构造函数,或者可能是一个带可选参数的构造函数。它仍然在调用构造函数。只有一个无参数构造函数或者也可以,但该构造函数必须调用基类中的构造函数。现在还不清楚您为什么要这样做。如果您能给我们更大的图景,我们很可能会提供帮助。@Sean:您不必发布完整的代码,只要让我们了解您试图实现的更大图景就行了。我是creating一个具有只读成员的抽象不可变类型。我希望此泛型“Get”方法能够使用基构造函数获取从该抽象类型派生的任何类的实例。因为它是不可变的,所以必须在构造函数中分配成员。如果可能的话,我不希望继承类型具有构造函数。但我会继续另一种方法。@Sean:你不能创建一个除了作为静态类(不能从
对象
以外的任何对象继承)之外没有构造函数的类型,也不能只创建抽象类的实例。你可以创建一个只有公共属性的类,并像这样初始化它:new Foo{Property1=x,Property2=x}。我想那个类仍然有一个默认的无参数构造函数。我想我是说除了默认构造函数之外没有其他构造函数。无论如何,只读属性不能以这种方式初始化。@Sean:这调用了无参数构造函数,或者可能是一个带可选参数的构造函数。它仍然在调用构造函数。只有一个无参数构造函数或者也可以,但该构造函数必须调用基类中的构造函数。仍然不清楚您为什么要这样做。如果您能给我们提供更全面的情况,我们可能会提供帮助。@Sean:您不必发布完整的代码,只要让我们了解您试图实现的更全面的情况就可以了。