C#接口可以像Rust traits一样工作吗?

bqujaahr  于 2023-04-21  发布在  C#
关注(0)|答案(1)|浏览(90)

我有以下C#模型(理论示例):

public class Filename
{
    public string Name { get; set; }
    public string Description { get; set; }
}

namespace Protobuf // Auto-generated
{
    public class Filename
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

我希望能够使用一个简单的方法将'Filename'类型转换为'Protobuf.Filename'类型。
现在我也知道Rust了。在这种情况下,我会在Rust中创建一个trait,并在'Filename'类型上实现它,如下所示:

trait ToProto<TProto> {
    fn to_proto(&self) -> TProto;
}

impl ToProto<protobuf::Filename> for Filename {
    fn to_proto(&self) -> protobuf::Filename {
        protobuf::Filename {
            format_string: self.format_string,
            description: self.description,
        }
    }
}

据我所知,Swift中的协议和扩展也可能有类似的情况。
我想在C#中使用接口和扩展方法,但它们似乎不能很好地相互配合。例如,这不是有效的C#:

public interface IProtoConvertible<T, TProto>
{
    public TProto ToProto(this T value);
}

我可以全部省略接口,只使用扩展方法,但这会导致大量重复的代码,这些代码会尖叫着“这可以更通用!”。
我是不是忽略了什么?这在C#中可能吗?
先谢谢你了。

6jjcrrmo

6jjcrrmo1#

也许你需要这样的东西:

public interface IProtoConvertible<T, TProto> where T : class
                                              where TProto : class
{
    public TProto ToProto<T>(T value)
    {
        // implementation here
        // return (TProto)new object();
    }
}

从C# 8.0开始,可以在接口方法中编写实现。

相关问题