是否可以从包含在其他类中的方法动态组成一个类?
例如。类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)