2010-08-13 167 views
1

我想寫一個擴展方法來擴展我的一些類的成員。具體來說,我想擴展一個枚舉。但是,這是行不通的:擴展類成員的擴展方法?

namespace mynamespace 
{ 
    public class myclass 
    { 
     public enum ErrorCodes 
     { 
      Error1, Error2, Error3 
     } 

     public static double GetDouble(this ErrorCodes ErrorCode) 
     { 
      return (double)((int)ErrorCode); 
     } 

     public void myfunc() 
     { 
      ErrorCodes mycode; 
      MessageBox.Show(mycode.GetDouble().ToString()); 
     } 
    } 
} 

具體來說,它不承認GetDouble()作爲擴展。這不僅僅是爲了枚舉,我試圖爲雙打創建一個擴展方法,也有同樣的問題。

+2

您是如何得到這個編譯的? – 2010-08-13 20:55:16

回答

5

您只能在頂級靜態非泛型類中編寫擴展方法,但它們可以擴展嵌套類。下面是一個完整的示例,基於您的代碼:

using System; 

public static class Extensions 
{ 
    public static double GetDouble(this Outer.ErrorCode code) 
    { 
     return (double)(int)code; 
    } 
} 

public class Outer 
{ 
    public enum ErrorCode 
    { 
     Error1, Error2, Error3 
    } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     Outer.ErrorCode code = Outer.ErrorCode.Error1; 
     Console.WriteLine(code.GetDouble()); 
    } 
} 
+0

「請注意,它是在非嵌套的非泛型靜態類中定義的」 – 2010-08-13 20:54:30

+0

@Steven:你在引用什麼? – 2010-08-13 20:55:41

+0

return(double)(int)code;可以返回(int)代碼,這個轉換是隱含的。 – 2010-08-13 20:56:42

2

擴展方法必須在靜態類中定義。

查看manual

編輯

正如喬恩指出,靜態類必須是頂級的,沒有嵌套。