C# 动态继承
我正在写一个程序,我有一个类没有扩展任何类 我想知道运行时的动态继承是否可行。我的意思是,如果一个或多个类可以在运行时从一个类派生。您可以看看。还有一些框架,如和,简化了这项任务C# 动态继承,c#,.net,reflection,C#,.net,Reflection,我正在写一个程序,我有一个类没有扩展任何类 我想知道运行时的动态继承是否可行。我的意思是,如果一个或多个类可以在运行时从一个类派生。您可以看看。还有一些框架,如和,简化了这项任务 更新: 现在,如果我理解正确,您有一些类,并且希望在运行时使这个类派生自另一个基类。让我们用反例证明这是不可能的: 假设有一种方法允许您这样做。考虑下面的类: public class Foo {} 你可以用这个方法来说明Foo是从中派生出来的,而这显然不是导致初始假设错误的情况 反射发射可以在运行时生成一个从基类
更新: 现在,如果我理解正确,您有一些类,并且希望在运行时使这个类派生自另一个基类。让我们用反例证明这是不可能的: 假设有一种方法允许您这样做。考虑下面的类:
public class Foo {}
你可以用这个方法来说明Foo是从中派生出来的,而这显然不是导致初始假设错误的情况
反射发射可以在运行时生成一个从基类继承或实现接口的动态类。您可以看看。还有一些框架,如和,简化了这项任务
更新: 现在,如果我理解正确,您有一些类,并且希望在运行时使这个类派生自另一个基类。让我们用反例证明这是不可能的: 假设有一种方法允许您这样做。考虑下面的类:
public class Foo {}
你可以用这个方法来说明Foo是从中派生出来的,而这显然不是导致初始假设错误的情况
反射发射可以在运行时生成从基类继承或实现接口的动态类。类必须在运行前获得其继承。您必须使用Reflection.Emit,它将允许您在运行时编写类。正如Darin所建议的,它使您能够使用动态代理,添加所需的功能。比起Reflection.Emit的负担和辛苦工作,我建议这样做。类必须在运行前获得继承。您必须使用Reflection.Emit,它将允许您在运行时编写类。正如Darin所建议的,它使您能够使用动态代理,添加所需的功能。相对于Reflection.Emit的负担和辛苦,我建议这样做。我认为这是不可能的,因为在运行时,每个类都必须有一个结构,而在运行时更改该结构会导致已经创建的对象出现问题。至少我是这么看的
但你到底为什么想要这样的东西?你可以发布一些代码示例或链接它们,这样我们就可以了解它的全部内容以及你想要实现的目标吗 我认为这是不可能的,因为在运行时,每个类都必须有一个结构,而在运行时更改该结构会导致已经创建的对象出现问题。至少我是这么看的
但你到底为什么想要这样的东西?你可以发布一些代码示例或链接它们,这样我们就可以了解它的全部内容以及你想要实现的目标吗 您要问的是如何在运行时检测类是否属于某种类型?有两种方法可以做到这一点,这取决于你在寻找什么
using System;
namespace ConsoleApplication1 {
class Program {
class Base { }
class Derived : Base { }
class OtherClass { };
static void Main(string[] args) {
Base b = new Base();
Derived d = new Derived();
OtherClass oc = new OtherClass();
TestObject(b);
TestObject(d);
TestObject(oc);
}
static void TestObject(object o) {
Type baseType = typeof(Base);
Type paramType = o.GetType();
Console.WriteLine("Type of o: {0}", paramType.Name);
Console.WriteLine("o is Base: {0}", o is Base);
Console.WriteLine("o is IsInstanceOfType Base: {0}", baseType.IsInstanceOfType(o));
Console.WriteLine("o is IsSubclassOf Base: {0}", paramType.IsSubclassOf(baseType));
Console.WriteLine("o is of type Base: {0}", baseType == paramType);
Console.WriteLine();
}
}
}
输出:
Type of o: Base
o is Base: True
o is IsInstanceOfType Base: True
o is IsSubclassOf Base: False
o is of type Base: True
Type of o: Derived
o is Base: True
o is IsInstanceOfType Base: True
o is IsSubclassOf Base: True
o is of type Base: False
Type of o: OtherClass
o is Base: False
o is IsInstanceOfType Base: False
o is IsSubclassOf Base: False
o is of type Base: False
您要问的是如何在运行时检测类是否属于某种类型?有两种方法可以做到这一点,这取决于你在寻找什么
using System;
namespace ConsoleApplication1 {
class Program {
class Base { }
class Derived : Base { }
class OtherClass { };
static void Main(string[] args) {
Base b = new Base();
Derived d = new Derived();
OtherClass oc = new OtherClass();
TestObject(b);
TestObject(d);
TestObject(oc);
}
static void TestObject(object o) {
Type baseType = typeof(Base);
Type paramType = o.GetType();
Console.WriteLine("Type of o: {0}", paramType.Name);
Console.WriteLine("o is Base: {0}", o is Base);
Console.WriteLine("o is IsInstanceOfType Base: {0}", baseType.IsInstanceOfType(o));
Console.WriteLine("o is IsSubclassOf Base: {0}", paramType.IsSubclassOf(baseType));
Console.WriteLine("o is of type Base: {0}", baseType == paramType);
Console.WriteLine();
}
}
}
输出:
Type of o: Base
o is Base: True
o is IsInstanceOfType Base: True
o is IsSubclassOf Base: False
o is of type Base: True
Type of o: Derived
o is Base: True
o is IsInstanceOfType Base: True
o is IsSubclassOf Base: True
o is of type Base: False
Type of o: OtherClass
o is Base: False
o is IsInstanceOfType Base: False
o is IsSubclassOf Base: False
o is of type Base: False
获取一个现有类并给它一个新的基类是不可能的。这是因为尽管可以动态构建新类型,但它们始终是新类型,而不是对已加载类型的修改。无法“卸载”现有类型以修改其定义并重新加载它。您可以卸载整个AppDomain,但单独AppDomain中的对象不能直接相互交互,因此它们的基类没有什么意义。获取现有类并为其提供新基类是不可能的。这是因为尽管可以动态构建新类型,但它们始终是新类型,而不是对已加载类型的修改。无法“卸载”现有类型以修改其定义并重新加载它。您可以卸载整个AppDomain,但单独AppDomain中的对象不能直接相互交互,因此它们的基类没有什么意义。支持原型继承的语言(例如JScript)允许您执行与您描述的非常类似的操作。也就是说,通过原型继承,您可以在运行时决定与特定“原型”关联的“实例”的继承方法的形状 抱歉,C#不支持此功能。如果您描述了为什么需要它,也许我们可以在C#中找到另一种方法。支持原型继承的语言(例如JScript)允许您执行与您描述的非常类似的操作。也就是说,通过原型继承,您可以在运行时决定与特定“原型”关联的“实例”的继承方法的形状 抱歉,C#不支持此功能。如果你描述一下你想要它的原因,也许我们可以找到另一个