C#中如何将拥有匹配方法签名的类转换为对应接口?
问题解答
1. 是否可以编写转换运算符将Baz转换为IFoo?
可以实现类似转换的效果,但无法直接给Baz类定义转换运算符(因为不能修改Baz源码),需要借助适配器模式来完成:
首先创建一个实现IFoo的适配器类,包装Baz实例并转发方法调用:
public class BazFooAdapter : IFoo { private readonly Baz _baz; public BazFooAdapter(Baz baz) { _baz = baz ?? throw new ArgumentNullException(nameof(baz)); } public void Bar() { _baz.Bar(); } }
如果想要用C#显式转换的语法(如(IFoo)bazInstance),可以在适配器类中定义显式转换运算符:
public class BazFooAdapter : IFoo { // 构造函数和Bar方法同上 public static explicit operator IFoo(Baz baz) { return new BazFooAdapter(baz); } }
此时就能通过(IFoo)bazInstance完成转换,将Baz实例纳入IFoo数组。
2. 是否可以将该转换运算符定义为Baz的扩展方法?
不行。C#的转换运算符属于类的专属成员,只能在类的内部定义,扩展方法仅支持添加普通的实例/静态方法,无法添加运算符、属性、事件这类特殊成员。
简化实现方案
如果觉得手动创建适配器麻烦,可以写一个扩展方法来快速转换:
public static class BazExtensions { public static IFoo ToIFoo(this Baz baz) { return new BazFooAdapter(baz); } }
使用时直接调用扩展方法即可:
Baz baz = new Baz(); IFoo[] fooArray = { new ConcreteFoo(), baz.ToIFoo() };
遍历数组调用Bar()时,适配器会自动将调用转发给Baz的Bar()方法,完全满足需求。
内容的提问来源于stack exchange,提问作者Vaughn Hartling
相关产品推荐
相关产品推荐

