這是我想做的事情......如何讓我的類在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