在c#中动态组合类



是否可以从包含在其他类中的方法动态组成一个类?

例如

。类A、B和C都有公共方法的命名,这样可以很容易地识别它们。它们需要被提取出来并添加到类D中。类D包含了所有的实现逻辑,可以进一步传递到一个只接受类D的单个实例并动态地将这些方法绑定到其他函数的系统中。

澄清一下,这不是我要找的继承。我的意思是,具有不同名称的方法需要塞进一个类中。我传递给它的系统理解这些命名约定并动态地绑定它们(对我来说这是一个黑盒子)。

我将沿着从A, B和C中提取方法的路径,动态地将它们与内存中的类D的源结合起来,并将它们编译成一个新的类D,然后创建一个D的实例并将其传递下去。

public class A{  public void EXPORT_A_DoSomething(){} }
public class B{  public void EXPORT_B_DoSomethingElse(){}}
public class C{  public void EXPORT_C_DoAnything(){}}
 //should become
public class D{ 
          public void EXPORT_A_DoSomething(){} 
          public void EXPORT_B_DoSomethingElse(){}
          public void EXPORT_C_DoAnything(){}
}

是否有一种方法可以从类a, B和C中提取methodinfo,并以某种方式直接将它们附加到类D?如果有,那是怎么回事?

我会考虑使用c# class编译器。从我所记得的,你可以在一个字符串中构建代码,你可以得到一个程序集作为输出。这样就可以通过反射来调用方法。

在我指定的MSDN链接上有一个例子,但是一旦我找到我的项目,我将在这里模拟一个。

您将无法仅导出方法。方法不能真正从它们所在的类中分离出来。(他们需要访问所有的成员字段/属性,包括继承)。

我认为你唯一能做的就是发出一个接口实现。(即使你说这不是你需要的,我不认为需要这些对象的私有状态的方法)

你可以创建一个只包含你需要的方法的接口,并提供一个支持它的类,其中包含每种类型对象的实例。

public class A{  public void DoSomething(){} }
public class B{  public void DoSomethingElse(){}}
public class C{  public void DoAnything(){}}
public interface ID 
{ 
    void A_DoSomething(); 
    void B_DoSomethingElse(); 
    void C_DoAnything(); 
}
public class D : ID 
{ 
    private A a;
    private B b;
    private C c;
    public D(A a,B b, C c) { this.a=a;this.b=b;this.c=c; }
    public void A_DoSomething(){ a.DoSomething();} 
    public void B_DoSomethingElse(){ b.DoSomethingElse();}
    public void C_DoAnything(){ c.DoSomething();
}

如果你需要动态地生成它,请查看Reflection.Emit。这将是一些关于如何创建新程序集,然后将其动态加载到AppDomain的业务。如果可以的话,我会尽量避免。

实际上应该可以使用所谓的"Mixins"和代理生成器。看看Castle。DynamicProxy教程:Mixins

另一个解决方案是将函数的类get和set访问器定义为接口,并声明您感兴趣的函数。

interface iA
{
    public int a { get; set; }
}
interface iB
{
    public int b { get; set; }
}
interface iAB : iA, iB
{
}
class MyClass : iA, iB
{
    public int b { get; set; }
    public int a { get; set; }
}
static class MyClassExtender
{
    static public int Foo(this iAB ab)
    {
        int c = ab.a + ab.b;
        ab.a = c;
        return c;
    }
    static public int FooA(this iA a)
    {
        int c = ab.a + 1;
        ab.a = c;
        return c;
    }
    static public int FooB(this iB b)
    {
        int c = ab.b + 1;
        ab.a = c;
        return c;
    }
}

所以现在"MyClass"可以使用Foo, FooA和FooB作为公共方法

您是否考虑过在您的D类中简单地使用散列或委托列表来指向其他类的方法?或者,使用动态对象(google ExpandoObject)

相关内容

  • 没有找到相关文章

最新更新