簡體   English   中英

C# 使用反射創建抽象實例

[英]C# create instance of abstract using reflection

遇到一個任務,需要在C#上使用反射創建抽象class的實例,同時禁止創建繼承人。

很明顯,禁止創建此類實例,但反思有助於克服這一點。 建議查看參考源站點上的源代碼,尋找類似於通過反射對構造函數進行內部調用的內容。 任務中的提示:需要在框架中找到一個方法,直接處理調用構造函數並模擬其邏輯,而無需進行不必要的檢查。 但我找不到。 我找到了如何創建抽象 class 的實例,但沒有初始化變量。

如何創建這樣一個實例,以便 class 個具有值的變量(如果存在)也被初始化?

如評論中所述,您可以調用內部RuntimeTypeHandle.Allocate方法來創建抽象 class 的實例。之后您可以實際調用構造函數。 調用抽象方法將拋出System.BadImageFormatException “Bad IL format”。 這種allocate方法只存在於.Net Framework中。

abstract class C
{

    public string One;

    public C()
    {
        One = "One";
    }

    public abstract void Abstract();

}

internal class Program
{
    static void Main(string[] args)
    {
        var obj = (C)typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { typeof(C) });
        typeof(C).GetConstructor(Type.EmptyTypes).Invoke(obj, new object[0]);

        // outputs "One"
        Console.WriteLine(obj.One);

        // throws BadImageFormatException
        obj.Abstract();
    }
}

以某種方式獲取抽象類型實例的另一個可怕的不安全選項可能是重寫現有對象類型信息,請參閱: https://github.com/IllidanS4/SharpUtils/blob/master/Unsafe/Chameleon.cs

這是不可能的,即使有反思也不可能。 如評論中所示,您將收到運行時錯誤。 可能的從抽象 class 創建代理(例如使用Castle.Core )。 但是那仍然不是創建抽象class的實例,而是為抽象成員動態創建一個實現。 然后創建該動態創建的實現的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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