2010-07-20 30 views
9

Tại sao tôi không thể thấy phương pháp mở rộng enum này? (Tôi nghĩ tôi điên mất).Tại sao tôi không thể "thấy" phương pháp mở rộng enum này?

File1.cs

namespace Ns1 
{ 
    public enum Website : int 
    { 
     Website1 = 0, 
     Website2 
    } 
} 

File2.cs

using Ns1; 

namespace Ns2 
{ 
    public class MyType : RequestHandler<Request, Response> 
    {       
     public override Response Handle(Request request,          CRequest cRequest) 
     { 
      //does not compile, cannot "see" ToDictionary 
      var websites = Website.ToDictionary<int>(); 

      return null; 
     } 
    } 


    //converts enum to dictionary of values 
    public static class EnumExtensions 
    {   
     public static IDictionary ToDictionary<TEnumValueType>(this Enum e) 
     {       
      if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified."); 

      return Enum.GetValues(e.GetType()) 
         .Cast<object>() 
         .ToDictionary(key => Enum.GetName(e.GetType(), key), 
             value => (TEnumValueType) value);    
     } 
    } 
} 

Trả lời

15

Bạn đang cố gắng gọi phương thức mở rộng như một phương pháp tĩnh vào loại chứ không phải là một phương pháp dụ về một đối tượng đó kiểu. Việc sử dụng phương thức mở rộng này không được hỗ trợ.

Nếu bạn có một thể hiện thì phương pháp khuyến nông được tìm thấy:

Website website = Website.Website1; 
var websites = website.ToDictionary<int>(); 
+3

nên nó không phải là trang web WebSite = WebSite.Website1; là một enum? – btlog

+1

@btlog: Cả hai đều hợp lệ. Trong trường hợp này, anh ta không sử dụng giá trị thực tế để nó không có sự khác biệt. –

+0

@btlog: 'new Website()' cho kết quả tương tự như 'Website.Website1' vì nó trả về giá trị mặc định, giá trị mặc định là 0. Không phải tôi khuyên bạn nên sử dụng cú pháp này :-) –

2

this Enum e đề cập đến một thể hiện enum, trong khi trang web thực sự là một kiểu lớp enum.

2

Phương thức mở rộng chỉ là syntactic sugar và chúng only work with instances and not with the type. Vì vậy, bạn phải gọi một phương pháp mở rộng trên một thể hiện của loại Website và không phải trên loại chính nó, như đã đề cập bởi Mark.

Để biết thông tin của bạn, Ngoài những gì Mark cho biết, Mã được chuyển đổi như dưới đây khi biên dịch.

//Your code 
Website website = new Website(); 
var websites = website.ToDictionary<int>(); 


//After compilation. 
Website website = new Website(); 
var websites = EnumExtensions.ToDictionary<int>(website); 

An improved version của phương pháp Mở rộng sẽ chỉ mở rộng loại Trang web chứ không phải là Enum.

//converts enum to dictionary of values 
public static class EnumExtensions 
{   
    public static IDictionary ToDictionary<TEnumValueType>(this Website e) 
    {       
     if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified."); 

     return Enum.GetValues(e.GetType()) 
        .Cast<object>() 
        .ToDictionary(key => Enum.GetName(e.GetType(), key), 
            value => (TEnumValueType) value);    
    } 
} 
0

Bạn cần thay đổi chữ ký của phương pháp mở rộng của bạn để sử dụng enum của bạn, chứ không phải là loại Enum tự. Nghĩa là, thay đổi Enum-Website trong phần mở rộng phương pháp chữ ký của bạn:

public static IDictionary ToDictionary<TEnumValueType>(this Website enum, ...) 
Các vấn đề liên quan