2011-12-13 38 views
5

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

+2

这不可能。 – 2011-12-13 22:41:31

+4

也许一些背景知道你想达到什么目的,为什么会帮助你获得有用的答案。 – 2011-12-13 22:42:26

+0

我不明白为什么这个问题被关闭为“不是一个真正的问题”。我认为OP很清楚要问什么。我承认这真的很“不正常”(正如@John Hanna在他的回答中所写的那样),但实际上我有一个问题(一个以前是公开的类,是从一个版本到另一个版本内部的,我们依赖于这个框架),我们可以通过继承内部类来“解决”,如果可能的话...... – pholpar 2018-01-29 11:31:16

回答

18

在面对不应该可能的事情时,我总是发现一种变态的概念,远远我会尝试创建一个继承自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(); 
     } 
    } 
} 
1

你不能。您可以使用Assembly.GetType()未公开的类型,但不能从中继承。 Jon Skeet explains in this article为什么访问非公开成员通常是一个糟糕的主意,并且比我更深入地回答你的问题。