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

时间:2010-12-08 23:36:57

标签: c#

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

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

    public static implicit operator Response(object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}

这不会编译,因为它扰乱了C#编译器,它告诉我

user-defined conversions to or from a base class are not allowed

将响应转换为响应并执行

public static implicit operator Response<T>(T source)
遗憾的是,

不是一种选择。我的猜测是 no ,但是任何人都可以想到一个很好的解决方法/黑客来让它工作。我希望能够做到

public Response Foo()
{
   return new Bar();
}

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

4 个答案:

答案 0 :(得分:4)

想想

Response r = CreateSomeExampleResponse();
Response r2 = r;

Response的任何基类定义用户定义的转换。这个例子会发生什么?第二项任务含糊不清:

  • r2引用新Response个实例,Content设置为r.ToString()
  • r2引用实例r指的是什么?

(好吧或R2必须用一些力量,光剑和东西做任何事情)

我们甚至可以将我们的想法扩展到Response的子类,这些子类因多态性而肯定是允许和正确的。

我想没有办法实现这一目标。此外,您的代码可能会更好看,但它远远不能理解。

答案 1 :(得分:4)

我不喜欢这样的隐式转换 - 其他答案已经解释了为什么不允许这样做。如果真的不希望代码中的构造函数调用是通过扩展方法进行转换的一个选项:

public static ResponseExtensions
{
    public static Response ToResponse(this object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}

然后你至少可以:

public Response Foo()
{
   return new Bar().ToResponse();
}

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

答案 2 :(得分:2)

我建议使用动态类型而不是隐式对象转换。它看起来基本上就像动态一样。

此外,请参阅此问题,讨论有关基类转换的讨论:User-defined conversion operator from base class 然而,这是一个非常具体的案例,真正需要演员阵容。您可能需要重新考虑您的设计。

答案 3 :(得分:1)

您的费用指标无法解决您的问题。错误中明确指出了这一点:user-defined conversions to or from a base class are not allowed。由于每个类都继承object,因此您有自己的答案。从Responseobject的继承意味着 Response的所有实例也是object 的实例!从objectResponse的隐式演员表示每个object都是Response ,这是一个废话!

在您的情况下,您是否可以简单地定义Bar - &gt; Response运营商?

执行类型转换时,您必须能够定义转换算法。你能告诉我你应该如何将一个只有哈希码和字符串表示的.NET中最通用的类​​型object转换为特定类型的对象?