我试图使用反射调用或创建抽象类的实例。这可能吗。这就是我尝试过的,但我得到一个错误说"无法创建抽象类的实例"。
Type dynType = myTypes.FirstOrDefault(a => a.Name == "MyAbstractClass");
ConstructorInfo getCons =
dynType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null);
object dynamicInstance = getCons.Invoke(null);
编辑:我可以使用反射访问此抽象类的属性吗?
答案 0 :(得分:2)
在抽象类上调用构造函数等同于尝试实例化抽象类,这是不可能的(您无法创建抽象类的实例)。
您需要做的是创建派生类的实例并声明其构造函数,以便它调用基础构造函数,如下所示:
public class DerivedClass : AbstractClass
{
public DerivedClass() : base()
{
....
}
}
完整示例:
public abstract class Abstract
{
public Abstract()
{
Console.WriteLine("Abstract");
}
}
public class Derived : Abstract
{
public Derived() : base()
{
Console.WriteLine("Derived");
}
}
public class Class1
{
public static void Main(string[] args)
{
Derived d = new Derived();
}
}
这是
的输出Abstract
Derived
答案 1 :(得分:0)
您无法实例化抽象类,甚至不能使用反射。
如果您需要实例,请:
abstract
修饰符。答案 2 :(得分:0)
您无法创建abstract
类的实例。但是,您可以使用继承并使用隐式转换
Derived derived = new Derived();
Abstract abstract = derived;
通过隐式转换,您可以将派生实例视为基类实例。
来自MSDN
The abstract modifier indicates that the thing being modified
has a missing or incomplete implementation.
请参阅MSDN以获取参考。
答案 3 :(得分:0)
正如之前所有答案中已经提到的:它无法实例化抽象类。
另一个重要注意事项:通过反射实例化实例,你应该使用Activator.CreateInstance而不是构造函数调用。
object dynamicInstance = Activator.CreateInstance(yourType, yourArguments);
对象创建是一个比简单地调用构造函数更复杂的过程。它需要分配必要的内存量,然后通过调用构造函数来设置对象本身。