2010-07-20 23 views
9

Bu enum uzantı yöntemini neden göremiyorum? (Sanırım, çıldırıyorum).Neden bu enum uzantı yöntemini "göremiyorum"?

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

cevap

15

Sen türüne statik yöntem olarak yerine bunun bir nesne üzerinde örnek yöntemi olarak uzatma yöntemi çağırmak için çalışıyoruz yazın. Bu uzatma yöntemlerinin kullanımı desteklenmez. Sonra uzatma yöntemi bulunursa bir örneği varsa

: Web sitesi aslında bir enum sınıf türüdür oysa

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

o = WebSite.Website1 WebSitesi web sitesi olması gerekmiyor; enum olmak mı? – btlog

+1

@btlog: Her ikisi de geçerli. Bu durumda gerçek değeri kullanmaz, bu yüzden fark etmez. –

+0

@btlog: 'Yeni Web Sitesi()', varsayılan değeri döndüren "Website.Website1" ile aynı sonucu verir, 0 değeridir. Ancak bu sözdizimini önermemem gerekir. :-) –

2

this Enum e, bir enum örneğine karşılık gelir.

2

Uzantı yöntemleri yalnızca syntactic sugar ve only work with instances and not with the type'dır. Bu nedenle, Mark tarafından belirtildiği gibi, türünün kendisinde değil, Website türünde bir uzantı yöntemini çağırmalısınız.

Bilgileriniz için, Mark'ın söylediklerine ek olarak, kod derlendiğinde aşağıdaki gibi dönüştürülür. Uzatma yönteminin bir 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); 

tip Sitesi değil yalnızca Enum uzatmak olacaktır.

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

Sen doğrusu Çetele tipinin kendisi daha sizin enum kullanmak için uzatma yönteminin imzasını değiştirmeniz gerekir. Bu senin uzantısı yöntem imzası Website için Enum değiştirmek geçerli:

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