如何将接口的隐式转换写入另一种类型?

时间:2011-04-21 15:19:28

标签: c# casting implicit-conversion

我正在尝试做类似下面的事情:

public class SomeWrapper : ISomeWrapper{

  public static implicit operator ActualRec(ISomeWrapper someWrapper)
        {
            return ((SomeWrapper)someWrapper).SomeInfo;
        }
}

但是这段代码失败了,说: “参数或返回类型必须是SomeWrapper类型。”

我理解编译正在陈述的问题。但是我需要这种类型的转换,因为在我的应用程序中我使用ISomeWrapper作为变量,存储SomeWrapper实例。 (另外,SomeWrapper是唯一实现ISomeWrapper的类。)

如果ISomeWrapper接口到我在具体类中知道的类型,有没有办法进行隐式转换?

编辑: 正如所有人所建议的那样,在C#中无法从接口进行隐式转换。

我需要这样做的原因?我想(隐式地)允许ISomeWrapper的用户调用需要ActualRec作为参数的方法WITHOUT允许访问ISomeWrapper的用户来调用ActualRec的方法/属性。

例如, 如果我在ISomeWrapper中包含属性ActualRec,那么ISomeWrapper的用户将能够调用ActualRec中可用的方法(Say,someWrapper.ActualRec.Dispose()),我不想公开它。

这就是尝试找到一些隐式转换的原因。

另外,我不希望跨应用程序使用SomeWrapper。

请建议是否有一些概念/模式来完成这项工作。

感谢您的关注。

3 个答案:

答案 0 :(得分:6)

这在C#中受到限制。请阅读以下内容。

http://msdn.microsoft.com/en-us/library/aa664464%28VS.71%29.aspx

  

如果满足以下所有条件,则允许类或结构声明从源类型S到目标类型T的转换:

     

...

     

S和T都不是对象或接口类型。

此外,

  

不允许用户定义的转换从接口类型转换或转换为接口类型。           特别是,此限制可确保不会发生用户定义的转换       转换为接口类型时,转换为接口类型成功       只有当被转换的对象实际上实现了指定的接口类型时。

答案 1 :(得分:6)

我想说你的设计存在缺陷。您正在从界面转换为具体类型,这使得界面的使用毫无意义。接口是一个合同,通过该合同,实现类型将符合提供所需的一组服务。在您的示例中,接口(合同)中是否未定义SomeInfo属性?如果没有,你为什么要尝试使用界面?您应该使用SomeWrapper作为输入参数本身。

答案 2 :(得分:2)

C#不允许这样做,因为这样的功能很容易导致难以理解的代码,这会让其他开发人员眼花缭乱。请尝试使用扩展方法:

public static class SomeWrapperExtensions
{
    public static ActualRec ToActualRec(
        this ISomeWrapper wrapper)
    {
        return ((SomeWrapper)someWrapper).SomeInfo;
    }
}

这允许您以不surprise其他开发人员的方式执行约定:

ActualRec rec = wrapper.ToActualRec();

请注意,这仍然很脆弱,因为您不知道ISomeWrapper是否实际代表SomeWrapper实施。