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#不支持此功能。如果你描述一下你想要它的原因,也许我们可以找到另一个