C#:当模板绑定到类型时动态绑定函数

C#:当模板绑定到类型时动态绑定函数,c#,generics,binding,C#,Generics,Binding,给定一个只在三种不同类型a、B和C上实例化的模板类,当模板绑定到一个类型时,有没有方法基于模板类型将外部函数调用绑定到另一个类 e、 g 类模板{ 私人打印机; Print(T obj){myPrinter.Print(obj); } 类打印机{ 公共印刷(obj){}; 公共印刷(B obj){}; 公共印刷(C obj){}; } 现在据我所知,上述措施将不起作用 这让我可以选择 1) 编写三个不同的类而不是模板(代码编写三次,然后在编译时静态绑定调用) 2) 更改设计,使打印功能包含在对

给定一个只在三种不同类型a、B和C上实例化的模板类,当模板绑定到一个类型时,有没有方法基于模板类型将外部函数调用绑定到另一个类

e、 g

类模板{
私人打印机;
Print(T obj){myPrinter.Print(obj);
}
类打印机{
公共印刷(obj){};
公共印刷(B obj){};
公共印刷(C obj){};
}
现在据我所知,上述措施将不起作用

这让我可以选择

1) 编写三个不同的类而不是模板(代码编写三次,然后在编译时静态绑定调用)

2) 更改设计,使打印功能包含在对象A、B和C中,并且模板更改为

class template<T> where T : IPrintable {
    private printer myPrinter;
    Print(T obj) {obj.Print());
}
类模板,其中T:IPrintable{
私人打印机;
Print(tobj){obj.Print());
}
但这将导致要调用的函数的运行时动态解析,在我的例子中,打印函数在逻辑上更多地属于打印机

3) 使用dynamic关键字,可以根据以下内容:

class template<T> {
    private printer myPrinter;
    Print(T obj) {myPrinter.Print((dynamic)obj);
}
类模板{
私人打印机;
Print(T obj){myPrinter.Print((动态)obj);
}
这里的绑定将发生在我想象中的每个函数调用上

因此,我真正想要的是一个解决方案,它将函数保留在printer类中(消除两个),不需要多次使用代码(消除1个),并且不是在每次调用时动态绑定Print函数,而是在模板初始化时动态绑定Print函数(消除3个)

基本上,我认为只要创建了模板,运行时环境就应该知道每次调用要调用哪个函数,而不需要每次调用该函数时都进行查找

所以我的问题是,我的上述理解正确吗?当模板绑定到一个模板类型时,有没有一种方法可以动态绑定,或者有更好的方法可以执行上述操作?使用动态类和多个类的开销是多少


感谢

在课堂
打印机
中使方法
打印
成为一种通用方法

class Printer
{
  public Print<T>(T obj) 
  {
    if(obj is A) DoLogicForTypeA();
    else if (obj is B) DoLogicforTypeB();
    else throw new IllegalArgumentException();
  }
}
类打印机
{
公共印刷品(T obj)
{
如果(obj是A)DoLogicForTypeA();
如果(obj是B)DoLogicforTypeB();
else抛出新的IllegalArgumentException();
}
}
调用模板通用:

Print(T obj) {myPrinter.Print<T>(obj);
Print(tobj){myPrinter.Print(obj);

您可能可以添加一些where约束以使其更好地工作。

@codymanix他似乎正在命名他的类模板。@Cookie:建议对类使用大写。同样,这并没有给我足够的自由来执行打印函数。如果type=a,我基本上需要a,使用内部成员订阅fora,如果type=B,use Subscriptions for B,…我用if结构编辑了它。如果您认为
DoLogicForTypeA
DoLogicforTypeB
有很多共同点,请为公共内容定义一个接口,并定义Constant
其中T:InterfaceCommonToTypes
。然后您可以在
Pri中使用
对象InterfaceCommonMethodOrProperty
nt(T obj)
方法。
Print(T obj) {myPrinter.Print<T>(obj);