簡體   English   中英

如何使用反射創建或調用抽象類的受保護構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM