2010-07-20 17 views
9

Perché non riesco a vedere questo metodo di estensione enum? (Penso che sto diventando pazzo).Perché non riesco a "vedere" questo metodo di estensione enum?

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

risposta

15

Si sta tentando di chiamare il metodo di estensione come metodo statico del tipo anziché come metodo di istanza su un oggetto di tale genere. Questo utilizzo di metodi di estensione non è supportato.

Se si dispone di un'istanza allora il metodo di estensione si trova:

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

non dovrebbe essere il sito WebSite = WebSite.Website1; essere un enum? – btlog

+1

@btlog: entrambi sono validi. In questo caso non sta usando il valore reale quindi non fa differenza. –

+0

@btlog: il 'nuovo sito Web()' fornisce lo stesso risultato di 'Website.Website1' poiché restituisce il valore predefinito, quello con il valore sottostante di 0. Non che raccomandi comunque questa sintassi :-) –

2

this Enum e si riferisce a un'istanza enum, mentre Sito web è in realtà un tipo di classe enum.

2

I metodi di estensione sono solo syntactic sugar e sono only work with instances and not with the type. Pertanto, è necessario chiamare un metodo di estensione su un'istanza di tipo Website e non sul tipo stesso, come indicato da Mark.

Per vostra informazione, oltre a ciò che Mark ha detto, il codice viene convertito come di seguito sulla compilazione.

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


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

Un improved version del metodo di estensione sarebbe quella di estendere il tipo di sito web e non solo 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

è necessario modificare la firma del metodo di estensione per usare il tuo enum, piuttosto che il tipo Enum stesso. Cioè, cambiare Enum-Website nel vostro metodo di estensione firma:

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