【发布时间】:2015-01-15 14:18:23
【问题描述】:
我正在尝试包装一个类型(在我的控制之外),以便它看起来无缝地实现了一个接口(也在我的控制之外)。
鉴于这些定义
// External types. Not changable.
class Foo {
public int I { get; set; }
public int J { get; set; }
}
interface IGenerateSignature {
string Generate();
}
我想使用Foo 实例来调用带有IGenerateSignature 参数的方法:
void Test() {
var foo = new Foo { I = 1, J = 2 };
GetSignature(foo);
}
void GetSignature(IGenerateSignature sig) {
Console.Write(sig.Generate());
}
我尝试创建一个这样的中间结构:
struct FooSignaturizer : IGenerateSignature {
private readonly Foo _foo;
public FooSignaturizer(Foo f) {
_foo = f;
}
public static implicit operator FooSignaturizer(Foo f) {
return new FooSignaturizer(f);
}
public string Generate() {
return _foo.I + ":" + _foo.J;
}
}
但由于某种原因,重载解析无法找到从Foo 到FooSignaturizer 的转换,并且出现“无法转换”编译器错误。如果我手动添加演员表GetSignature((FooSignaturizer) foo),它会起作用。但是,我还需要添加对Bar 和Qux 类型的支持,包括BarSignaturizer 和QuxSignaturizer,因此演员表不适用于这些情况。
有没有办法做到这一点?
【问题讨论】:
-
为什么
FooSignaturizer是一个结构而不是一个类? -
您是否尝试过创建对接口类型的隐式强制转换?
-
@OmriAharon:如果我让它工作,它将用于代码库中性能非常关键的部分,分配非常多。有人建议,可能会在堆栈上分配一个结构,以减少垃圾收集器的负载。这在一定程度上是一个测试,看看这在“现实世界”的案例中是否真的如此。
-
@juharr:我认为你不能对接口进行隐式转换。
-
@juharr:据我所知这是不可能的?如果我错了,请赐教:)
标签: c# implicit-conversion overload-resolution