2010-07-13 36 views
4

这是我想做的事情......如何让我的类在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;

+0

我在这里目前缺少的是任何有关重写'ToString()'的提示。 – Oliver 2010-07-13 07:31:00

+0

@奥利弗:它已经被提出好几次了,并且被反复推倒,因为a)它不是一个隐含的演员,和b)它比隐式演员更令人困惑。 – 2010-07-13 07:45:11

回答

8
public class A 
{ 
    public string Content { get; set; } 
    public static implicit operator string(A a) 
    { 
     return string.Format("<span>{0}</span>", a.Content); 
    } 
} 
+0

绝对完美的答案!非常感谢! – jedmao 2010-07-13 07:15:34

+0

+1以获得完全正确的答案。但是,我强烈建议不要在实践中这样做,因为大卫的回答中提到的原因。 – 2010-07-13 07:29:48

12

您可以手动覆盖类的隐式和显式转换运算符。 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>"

+0

我同意你关于糟糕的设计;尽管如此,我的例子只是一个例子。我想要做的事情要复杂得多。感谢你的回答!这非常有帮助。 – jedmao 2010-07-13 07:13:29

+4

@sfjedi:场景越复杂,隐含转换越不恰当,IMO。根据我的经验,有*非常少的地方让代码更清晰。 – 2010-07-13 07:16:44

+0

我总是会使用“ToString()”转换为字符串,稍后再考虑有人维护代码并意外地将对象分配给字符串而不是该对象的副本......可能需要几周追踪(由于密码盲) – Mauro 2010-07-13 07:36:19

3
public static implicit operator string(A a) 
{ 
    return "foo"; 
} 
+0

很好的答案,但我会投票@desco的答案,因为它更完整。抱歉。 – jedmao 2010-07-13 07:15:07

0

重写的ToString()将是很好的方式。而且在调试模式下,你得到了一个ToString()返回值的提示。

+0

复制我对BennySkogbergs的回应现在删除了回复:我认为重写'ToString'比隐式投射更具误导性。当使用隐式演员时,有人可能会被欺骗,认为“a”是一个字符串,但是如果仔细观察,就会发现*某事正在发生。这个代码*每个人*都会假设'b'在该操作之后将包含类似“myNamespace.A”的内容。 – 2010-07-13 07:44:30

相关问题