来自对象的隐式转换运算符

The*_*kie 7 c#

我想知道是否有人可以想到一个很好的解决方法,因为无法在自己的类上为对象添加隐式强制转换操作符.以下示例说明了我想要的代码类型

public class Response
{
    public string Contents { get; set; }

    public static implicit operator Response(object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为它扰乱了C#编译器,它告诉我

user-defined conversions to or from a base class are not allowed
Run Code Online (Sandbox Code Playgroud)

将响应转化为响应和行动

public static implicit operator Response<T>(T source)
Run Code Online (Sandbox Code Playgroud)

遗憾的是不是一种选择.我的猜测是否定的,但任何人都可以想到一个很好的解决方法/黑客来实现这一点.我很乐意能够做到

public Response Foo()
{
   return new Bar();
}
Run Code Online (Sandbox Code Playgroud)

最后得到一个表示Whatever.Namespace.Bar的Response.Contents

Jon*_*eet 5

我不喜欢这样的隐式转换 - 其他答案已经解释了为什么不允许这样做。如果您确实不想在代码中调用构造函数,则可以轻松进行转换的一种选择是通过扩展方法:

public static ResponseExtensions
{
    public static Response ToResponse(this object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你至少可以拥有:

public Response Foo()
{
   return new Bar().ToResponse();
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我对 上的扩展方法持谨慎态度object,请注意...将任何对象转换为真的Response有意义吗?


usr*_*ΛΩΝ 1

您的约束问题无法解决。错误中明确指出了这一点:user-defined conversions to or from a base class are not allowed。由于每个类都会继承object,所以你有你的答案。继承自Responsetoobject意味着 的所有实例Response也是 的实例object!隐式转换 from objecttoResponse意味着everyobject是 aResponse,这是无稽之谈!

在你的情况下,你可以简单地定义一个Bar->Response运算符吗?

当您执行类型转换时,您必须能够以某种方式定义转换算法。您能告诉我如何将object.NET 中最通用的类​​型(仅具有哈希码和字符串表示形式)转换为特定类型的对象吗?