当前位置:  开发笔记 > 后端 > 正文

如何使用.Net中的反射继承密封类?

如何解决《如何使用.Net中的反射继承密封类?》经验,为你挑选了2个好方法。

在你开始向我射击之前,我不打算这样做,但是另一篇文章中有人说这是可能的.这怎么可能?我从未听说过使用反射继承任何东西.但我看到一些奇怪的事情......



1> Orion Edward..:

如果没有要覆盖的虚函数,则对子类化密封类没有多大意义.

如果您尝试在其中编写带有虚函数的密封类,则会出现以下编译器错误:

// error CS0549: 'Seal.GetName()' is a new virtual member in sealed class 'Seal'

但是,您可以通过在基类中声明它们来将虚函数转换为密封类(如此),

public abstract class Animal
{
    private readonly string m_name;

    public virtual string GetName() { return m_name; }

    public Animal( string name )
    { m_name = name; }
}

public sealed class Seal : Animal
{
    public Seal( string name ) : base(name) {}
}

问题仍然存在,我无法看到你如何偷偷通过编译器让你声明一个子类.我尝试使用IronRuby(ruby是所有hackety语言中最黑的)但即使它不会让我.

'密封'部分嵌入到MSIL中,所以我猜测CLR本身实际上是强制执行的.你必须加载代码,解组,删除'密封'位,然后重新组装,并加载新版本.


攻击者比安全系统更强大的安全漏洞并不是缺陷."我用相同的锁替换了所有锁,但我们用手机上的蓝牙命令响应,我闯入你的建筑物.与您取下我的锁相比,蓝牙攻击无关紧要!
阿们,雅各布.让我想起我读过的一篇文章,声称Windows有一个安全漏洞,如果你从自己的设备启动一台机器,你可以进入Windows硬盘上的其他用户的文件夹.作者对微软的回应不满意:"当你允许用户不受限制地访问计算机时,你不能指望安全性."
我见过一个例子,有人修补了clr本身.搜索Dinis Cruz和OWASP,您应该找到它
crikey.这是硬核

2> dalle..:

我很抱歉在另一个帖子中发布了错误的假设,我无法回想起来.使用以下示例,使用Reflection.Emit,显示如何从另一个类派生,但它在运行时失败抛出TypeLoadException.

sealed class Sealed
{
   public int x;
   public int y;
}

class Program
{
   static void Main(string[] args)
   {
      AppDomain ad = Thread.GetDomain();
      AssemblyName an = new AssemblyName();
      an.Name = "MyAssembly";
      AssemblyBuilder ab = ad.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
      ModuleBuilder mb = ab.DefineDynamicModule("MyModule");
      TypeBuilder tb = mb.DefineType("MyType", TypeAttributes.Class, typeof(Sealed));

      // Following throws TypeLoadException: Could not load type 'MyType' from
      // assembly 'MyAssembly' because the parent type is sealed.
      Type t = tb.CreateType();
   }
}


@OrionEdwards:这就是我在这个答案中写的.它不起作用,我在以前的假设中是不正确的.
如果你无法加载你生成的东西,我认为这不会像创建派生类那样...毕竟,你可以使用`Reflection.Emit`创建各种混乱的东西,但这不是这样做是为了让那些东西现在以某种方式有效.
+100,您节省了我数小时的研究。这表明即使我们动态构建子类,也无法从密封类继承。我验证了注释掉父类上的`sealed`关键字可以防止该异常。对于阅读此书的任何人,您至少需要在顶部至少添加“使用System.Reflection.Emit;”和“使用System.Threading;”。我仍在寻找一种在运行时修改非虚拟密封类方法的方法,但看起来甚至Harmony也使用`unsafe`关键字。我无法让Pose在Unity中工作,而Cecil仅修改磁盘上的已编译程序集:-(
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有