2010-07-20 8 views
9

이 열거 형 확장 메서드가 표시되지 않는 이유는 무엇입니까? (나는 내가 미쳤다고 생각한다).이 열거 형 확장 메서드를 "볼"수없는 이유는 무엇입니까?

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);    
     } 
    } 
} 

답변

15

당신은 종류에 정적 방법으로보다는 그 개체에서 인스턴스 메서드로 확장 메서드를 호출하려고 유형. 확장 메서드의 이러한 사용은 지원되지 않습니다. 그런 다음 확장 메서드가 발견 인스턴스가있는 경우

: 웹 사이트가 실제로 열거 클래스 타입 인 반면

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

그것이 = WebSite.Website1 웹 사이트 웹 사이트 없을 겁니다; 열거 형인가요? – btlog

+1

@btlog : 둘 다 유효합니다. 이 경우 그는 실제 값을 사용하지 않으므로 아무런 차이가 없습니다. –

+0

@btlog :'new Website()'는 기본 값인 0을 기본 값으로하는'Website.Website1'과 동일한 결과를 제공합니다. 그러나이 구문은 권장하지 않습니다 :-) –

2

this Enum e는 열거 인스턴스를 나타냅니다.

2

확장 메서드는 단지 syntactic sugar이고, 이들은 only work with instances and not with the type입니다. 따라서 Mark에서 언급 한 것처럼 유형 자체가 아닌 Website 유형의 인스턴스에 대해 확장 메소드를 호출해야합니다.

Mark가 말한 것 이외에 귀하의 정보는 다음과 같이 편집 될 때 코드가 변환됩니다. 확장 방법의 improved version

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


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

는 유형 웹 사이트 만이 아니라 열거을 확장하는 것입니다.

//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

당신은 오히려 열거 형 자체보다 당신의 열거를 사용하도록 확장 메서드의 서명을 변경해야합니다. 그게 당신의 확장 메서드 서명에 Website-Enum을 변경할 수 있습니다 :

public static IDictionary ToDictionary<TEnumValueType>(this Website enum, ...)