通过反射从内部类动态继承

EOG*_*EOG 6 .net c# reflection inheritance

有没有办法使用.NET Framework 4.0从动态生成的运行时类(例如通过反射)中继承内部抽象类?

Jon*_*nna 21

面对一些不可能发生的事情,出于普遍的堕落感,我试着看看我在尝试创建一个继承自System.CurrentSystemTimeZone(mscorlib中的内部类)的类时会走多远.它让你得到创建一个TypeBuilder但是当你调用CreateType它时抛出一个TypeLoadException消息"访问被拒绝:'System.CurrentSystemTimeZone'."

更麻烦的是,我得出结论,你可以动态创建一个具有强名称的程序集,该程序集将其标识为程序集的友元程序集,其中定义了内部类型.但是,在那种情况下,无论如何你都可以编码class Foo : CurrentSystemTimeZone,不会留下任何诡计.

无论如何,代码一直到投掷的线是在下面,以防万一有人心情尝试一些更不正常的变化的想法,并想要一个起点:

using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;

namespace ReflectPerversely
{
    class SuicidallyWrong
    {
        private static ModuleBuilder mb;
        public static Assembly ResolveEvent(Object sender, ResolveEventArgs args)
        {
            return mb.Assembly;
        }
        public static void Main(string[] args)
        {
            Assembly sys = Assembly.GetAssembly(typeof(string));
            Type ic = sys.GetType("System.CurrentSystemTimeZone",true);
            AssemblyName an = new AssemblyName();
            an.Name = "CheatingInternal";
            AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
            mb = ab.DefineDynamicModule("Mod", "CheatingInternal.dll");
            AppDomain currentDom = Thread.GetDomain();
            currentDom.TypeResolve += ResolveEvent;

            TypeBuilder tb = mb.DefineType("Cheat", TypeAttributes.NotPublic | TypeAttributes.Class, ic);

            Type cheatType = tb.CreateType();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


sur*_*fen 5

当然你可以而且你不需要反思.继承的类只需要在同一个程序集中:)

您还可以在程序集之间设置友谊:http://msdn.microsoft.com/en-us/library/0tke9fxk%28v=VS.100%29.aspx,这将允许访问一个程序集的内部类.此方法有时可用于创建需要内部访问已测试程序集的单元测试程序集