有没有办法通过使用.NET Framework 4.0的动态生成的运行时类(如通过反射)从内部抽象类继承?通过反射动态地继承内部类
5
A
回答
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为什么访问非公开成员通常是一个糟糕的主意,并且比我更深入地回答你的问题。
5
当然,你可以和你不需要反思。 继承的类只需要在同一个程序集:)
您还可以设置程序集之间的友谊:http://msdn.microsoft.com/en-us/library/0tke9fxk%28v=VS.100%29.aspx,这将允许访问一个程序集的内部类。 这种方法有时可用于创建需要内部访问测试程序集的单元测试程序集
相关问题
- 1. 通过反射使用EventArg继承
- 2. 动态通过反射
- 3. 通过反射动态地向Guice添加类
- 4. asp.net MVC部分动态继承类?
- 5. 继承内部类Python3
- 6. Kotlin内部类继承
- 7. Java内部类和继承
- 8. 继承自内部类
- 9. 通过外部访问静态成员并通过继承C++
- 10. PHP动态类继承
- 11. 如何在Python中通过继承正确地启动子类?
- 12. 通过继承
- 13. 通过反射获取所有内部类
- 14. 如何通过反射正确实例化内部类?
- 15. 通过反射获得一个类的内部对象的值
- 16. Makefiles - 继承的类和内部类
- 17. 启动意图内部方法运行通过反射
- 18. 继承使用静态内部类构建的类生成器
- 19. 动态类的c#反射
- 20. 如何通过Java反射动态创建Java类?
- 21. 从汇编动态解析类型通过反射加载
- 22. 继承静态类
- 23. Fluenthibernate映射继承/子类
- 24. 继承部分类
- 25. C++多态 - 继承类的地图
- 26. 通过继承C++
- 27. 继承vs扩展与内部类
- 28. 继承内部java类的问题
- 29. 通用类继承
- 30. Ruby:动态继承
这不可能。 – 2011-12-13 22:41:31
也许一些背景知道你想达到什么目的,为什么会帮助你获得有用的答案。 – 2011-12-13 22:42:26
我不明白为什么这个问题被关闭为“不是一个真正的问题”。我认为OP很清楚要问什么。我承认这真的很“不正常”(正如@John Hanna在他的回答中所写的那样),但实际上我有一个问题(一个以前是公开的类,是从一个版本到另一个版本内部的,我们依赖于这个框架),我们可以通过继承内部类来“解决”,如果可能的话...... – pholpar 2018-01-29 11:31:16