2013-02-14 58 views
1

我的客戶想出了在項目代碼的每個的ToString()調用,我們應該做一個定製的操作(如添加在數據庫中的行)擴展方法編譯優先

我覺得擴展方法奇怪的要求對我來說會非常有用,如果它爲我提供了壓倒性的設施。

Microsoft爲什麼不允許擴展方法覆蓋類方法的現有行爲的任何原因?

我聽說編譯器優先考慮擴展方法的優先級低於類方法。有沒有辦法將編譯器修改爲優先級擴展方法而不是類方法?

+4

這是一個*真*奇怪的要求。我建議你簡單地推回去。 (客戶端是否希望這種行爲對於ToString的每個* implicit *調用,例如在字符串連接中?那麼在.NET框架代碼中調用ToString怎麼樣?) – 2013-02-14 07:17:36

+1

我同意。教育你的客戶。這也是你作爲顧問工作的一部分。 – 2013-02-14 07:18:09

+0

我也同意這個:) ..謝謝你的評論.. – 2013-02-14 07:23:31

回答

7

有沒有辦法將編譯器修改爲優先級擴展方法比類方法更多 ?

不,你不能。

我會從類似question引述埃裏克利珀:

的擴展方法的目的是延長該組的類型可用的方法 ,不重寫現有的方法;這就是爲什麼 他們是所謂的「擴展方法」

MSDN - Extension Method

您可以使用擴展方法擴展一個類或接口,但不 覆蓋它們。具有相同名稱和 簽名作爲接口或類方法的擴展方法將永遠不會被調用。

1

實際上,擴展本身存在問題。 因爲實例的ToString()方法將具有擴展性。

還有a good explanation on the Microsoft Developer Network

簡而言之:

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      string value = "test"; 
      Console.WriteLine(value.ToString()); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
     Console.WriteLine("End"); 
     Console.Read(); 
    } 
} 
public static class StaticExtensions 
{ 
    public static string ToString(this Object obj) 
    { 
     if (obj == null) 
      return ""; 
     else 
      return obj.GetType().FullName + obj.ToString() ; 
    } 
} 

將返回測試。

你應該嘗試另一種方式。也許代理對象或某個東西在那個方向。