2010-07-13 47 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

相關問題