【发布时间】:2018-04-23 21:03:41
【问题描述】:
假设我有一些外部类,它们的方法按约定共享签名,但没有实现接口:
class A {
public string getError();
}
class B {
public string getError();
}
如果我想创建一个接受任一类型对象的实用函数,我可以使用dynamic:
void printError(dynamic obj) {
Console.WriteLine("Error: {0}", obj.getError());
}
但是,如果我传递了某个类 C 而没有 getError 方法,这将是一个运行时错误。鉴于我不能(直接)修改A 或B,有没有办法实现这一点,这样在没有getError 方法的情况下传递类型将是编译时错误,类似于我们'd get with C++ 模板?
【问题讨论】:
-
你不能只为每种类型设置一个重载吗?
printError(A obj)和printError(B obj) -
另一种选择是编写共享公共接口的包装类。
-
或者,
void printError(Func<string> getErrorFunc)并像printError(new A().getError)一样调用它?当然,如果约定比这个例子更复杂,那会很痛苦。 -
你也可以查看
obj.GetType().GetMethod("getError") != null(虽然不保证没有参数,就是返回字符串) -
这些类不能实现接口有什么原因吗?
标签: c# types type-conversion