这是我想做的事情......如何让我的类在C#中隐式转换为字符串?
public class A
{
public string Content { get; set; }
}
A a = new A();
a.Content = "Hello world!";
string b = a; // b now equals "<span>Hello world!</span>"
所以我想控制a
如何转化为String
&hellip;不知何故&hellip;
这是我想做的事情......如何让我的类在C#中隐式转换为字符串?
public class A
{
public string Content { get; set; }
}
A a = new A();
a.Content = "Hello world!";
string b = a; // b now equals "<span>Hello world!</span>"
所以我想控制a
如何转化为String
&hellip;不知何故&hellip;
public class A
{
public string Content { get; set; }
public static implicit operator string(A a)
{
return string.Format("<span>{0}</span>", a.Content);
}
}
绝对完美的答案!非常感谢! – jedmao 2010-07-13 07:15:34
+1以获得完全正确的答案。但是,我强烈建议不要在实践中这样做,因为大卫的回答中提到的原因。 – 2010-07-13 07:29:48
您可以手动覆盖类的隐式和显式转换运算符。 Tutorial here。不过,我认为大部分时间都是糟糕的设计。我会说这是更容易地看到发生了什么事情,如果你写
string b = a.ToHtml();
但它肯定可以...
public class A
{
public string Content { get; set; }
public static implicit operator string(A obj)
{
return string.Concat("<span>", obj.Content, "</span>");
}
}
举为什么我不建议这样的一个例子,考虑以下:
var myHtml = "<h1>" + myA + "</h1>";
上面会,产生"<h1><span>Hello World!</span></h1>"
现在,一些其他开发人员出现了,认为上面的代码看起来很差,并重新格式化为以下几点:
var myHtml = string.Format("<h1>{0}</h1>", myA);
但string.Format
内部调用ToString
每一个接收参数,所以我们不再处理隐式转换,作为结果,其他的开发商将有改变的结局像"<h1>myNamespace.A</h1>"
public static implicit operator string(A a)
{
return "foo";
}
很好的答案,但我会投票@desco的答案,因为它更完整。抱歉。 – jedmao 2010-07-13 07:15:07
重写的ToString()将是很好的方式。而且在调试模式下,你得到了一个ToString()返回值的提示。
复制我对BennySkogbergs的回应现在删除了回复:我认为重写'ToString'比隐式投射更具误导性。当使用隐式演员时,有人可能会被欺骗,认为“a”是一个字符串,但是如果仔细观察,就会发现*某事正在发生。这个代码*每个人*都会假设'b'在该操作之后将包含类似“myNamespace.A”的内容。 – 2010-07-13 07:44:30
我在这里目前缺少的是任何有关重写'ToString()'的提示。 – Oliver 2010-07-13 07:31:00
@奥利弗:它已经被提出好几次了,并且被反复推倒,因为a)它不是一个隐含的演员,和b)它比隐式演员更令人困惑。 – 2010-07-13 07:45:11