7

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

例如。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 类中提取 MethodInfos 并以某种方式直接将它们附加到 D 类?如果有怎么办?

4

5 回答 5

2

我会考虑使用C# Class compiler。据我所知,您可以构建字符串中的代码,并且可以将程序集作为输出。然后,这使您能够通过反射调用方法。

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

于 2013-03-18T15:02:59.773 回答
1

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

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

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

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 中,这将是一些事情。如果可以的话,我会尽量避免这种情况。

于 2013-03-18T15:37:44.063 回答
0

另一种解决方案是将函数的类 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 作为公共方法。

于 2013-03-18T15:21:39.633 回答
0

实际上应该可以使用称为“混合”的东西和代理生成器。看看 Castle.DynamicProxy 的教程:Mixins

于 2013-03-18T15:25:30.367 回答
-1

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

于 2013-03-18T15:14:28.203 回答