C# 使用反射创建抽象实例

C# create instance of abstract using reflection

我遇到了一个任务,需要在 C# 上使用反射创建抽象 class 的实例。同时禁止创建继承人

显然禁止创建此类实例,但反射有助于克服这一点。建议查看参考源站点上的源代码,寻找类似通过反射对构造函数进行内部调用的内容。 任务中的提示:需要在框架中找到一个方法,直接处理调用构造函数并模拟其逻辑,而无需进行不必要的检查。但是我找不到。我找到了如何创建抽象实例 class,但没有初始化变量。

如何创建这样的实例,以便 class 具有值的变量(如果存在)也被初始化?

这是不可能的,即使是反射也不行。如评论中所示,您将收到运行时错误。 的可能,是从抽象 class 创建代理(例如使用 Castle.Core)。但这仍然不是创建抽象实例class,而是动态创建抽象成员的实现。然后创建该动态创建的实现的实例。

如评论中所述,您可以调用内部RuntimeTypeHandle.Allocate 方法来创建抽象class 的实例。之后你可以实际调用构造函数。调用抽象方法将抛出 System.BadImageFormatException“错误的 IL 格式”。此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