[英]Implicit cast operator from object
我想知道是否有人可以想到一个很好的解决方法,因为无法在自己的类上为对象添加隐式强制转换操作符。 以下示例说明了我想要的代码类型
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)
遗憾的是不是一种选择。 我的猜测是否定的 ,但任何人都可以想到一个很好的解决方法/黑客来实现这一点。 我很乐意能够做到
public Response Foo()
{
return new Bar();
}
最后得到一个表示Whatever.Namespace.Bar的Response.Contents
想一想
Response r = CreateSomeExampleResponse();
Response r2 = r;
具有为Response
任何基类定义的用户定义转换。 这个例子会发生什么? 第二项任务含糊不清:
r2
引用一个新的Response
实例,其Content
设置为r.ToString()
或 r2
引用到实例r
是指? (好吧或R2必须用一些力量,光剑和东西做任何事情)
我们甚至可以将我们的想法扩展到Response
子类,由于多态性,这些子类肯定是允许和正确的。
我想没有办法实现这一目标。 此外,您的代码可能会更好看,但它远远不能被理解。
我不喜欢这样的隐式转换 - 其他答案已经解释了为什么不允许这样做。 如果您真的不想在代码中使用构造函数调用,那么使转换变得容易的一个选项是通过扩展方法:
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
是否真的有意义?
我建议使用动态类型而不是隐式对象转换。 它看起来基本上就像动态一样。
此外,请参阅此问题以讨论有关基类转换的争论:来自基类的用户定义转换运算符然而,这是一个非常具体的情况,其中真正需要强制转换。 您可能需要重新考虑您的设计。
您的成本计算没有解决您的问题的方法。 错误中明确指出了这一点: user-defined conversions to or from a base class are not allowed
。 由于每个类都继承了object
,因此您有自己的答案。 从继承Response
到object
意味着所有实例Response
也实例object
! 从object
隐式转换为Response
意味着每个object
都是一个Response
,这是一个废话!!!
在您的情况下,您可以简单地定义一个Bar
- > Response
运算符吗?
执行类型转换时 ,您必须能够定义转换算法。 你能告诉我你应该如何将一个object
(一种只有哈希码和字符串表示的.NET中最通用的类型)转换为特定类型的对象?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.