![](/img/trans.png)
[英]System.Reflection.MethodInfo class is abstract then why it has a protected constructor?
[英]How to create or invoke protected constructor of abstract class using reflection?
我試圖使用反射調用或創建抽象類的實例。 這可能嗎。 這是我嘗試的方法,但是出現錯誤消息“無法創建抽象類的實例”。
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);
編輯:我可以使用反射訪問此抽象類的屬性嗎?
在抽象類上調用構造函數等效於嘗試實例化一個抽象類,這是不可能的(您無法創建抽象類的實例)。
您需要做的是創建一個派生類的實例,並聲明其構造函數,以便它按如下方式調用基本構造函數:
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
您不能實例化一個抽象類,甚至不能使用反射。
如果需要實例,請執行以下任一操作:
abstract
修飾符。 您不能創建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以獲取參考。
正如前面所有答案中已經提到的那樣:無法實例化抽象類。
另一個重要說明:通過反射實例化實例,您應該使用Activator.CreateInstance,而不要使用構造函數調用。
object dynamicInstance = Activator.CreateInstance(yourType, yourArguments);
與簡單地調用構造函數相比,對象創建過程稍微復雜一些。 它需要分配必要的內存量,然后才通過調用構造函數來設置對象本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.