如何编写从接口到另一种类型的隐式转换?

问题描述 投票:0回答:3

我正在尝试做如下的事情:

public class SomeWrapper : ISomeWrapper{

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

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

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

如果 ISomeWrapper 接口与我在具体类中知道的类型有什么方法可以进行隐式转换吗?

编辑: 正如大家所建议的,在 C# 中不可能从接口进行隐式转换。

我需要这样做的原因是什么?我想(隐式)允许 ISomeWrapper 的用户调用需要 ActualRec 作为参数的方法,而不授予 ISomeWrapper 的用户调用 ActualRec 的方法/属性的访问权限。

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

这就是尝试寻找隐式转换的原因。

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

请建议是否有一些概念/模式可以完成此任务。

感谢您的关注。

c# casting implicit-conversion
3个回答
7
投票

这在 C# 中受到限制。请阅读下文。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#1052-permissed-user-defined-conversions

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

...

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

还有,

用户定义的转换不允许与接口类型相互转换。 特别是,此限制可确保不会发生用户定义的转换 当转换为接口类型时,并且转换为接口类型成功 仅当被转换的对象实际实现指定的接口类型时。


6
投票

我想说你的设计有缺陷。 您从接口转换为具体类型,这使得接口的使用变得毫无意义。接口是一个契约,通过它实现类型将符合提供一组所需的服务。在您的示例中,接口(合约)中是否未定义

SomeInfo
属性?如果没有,你为什么要尝试使用界面进行转换?您应该使用
SomeWrapper
作为输入参数本身。


2
投票

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

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

这允许您以一种不会让其他开发人员感到惊讶的方式进行约定:

ActualRec rec = wrapper.ToActualRec();

请注意,这仍然很脆弱,因为您不知道

ISomeWrapper
是否实际上代表
SomeWrapper
实现。

© www.soinside.com 2019 - 2024. All rights reserved.