2010-07-20 13 views
9

Warum kann ich diese enum extension-Methode nicht sehen? (Ich glaube, ich werde verrückt).Warum kann ich diese Enum-Erweiterungsmethode nicht "sehen"?

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

Antwort

15

Sie versuchen die Extension-Methode als statische Methode von der Art und nicht als eine Instanz-Methode auf einem Objekt, das nennen Art. Diese Verwendung von Erweiterungsmethoden wird nicht unterstützt.

Wenn Sie eine Instanz haben dann die Erweiterungsmethode gefunden wird:

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

Sollte es nicht Website Website sein = WebSite.Website1; ein enum sein? – btlog

+1

@btlog: Beide sind gültig. In diesem Fall verwendet er nicht den tatsächlichen Wert, so dass es keinen Unterschied macht. –

+0

@btlog: Die 'neue Website()' gibt das gleiche Ergebnis wie 'Website.Website1', da sie den Standardwert zurückliefert, der mit dem zugrunde liegenden Wert 0. Nicht dass ich diese Syntax jedoch empfehle :-) –

2

this Enum e bezieht sich auf eine Enum-Instanz, während Webseite tatsächlich ein Enum-Klasse-Typ ist.

2

Erweiterungsmethoden sind nur syntactic sugar und sie only work with instances and not with the type. Daher müssen Sie eine Erweiterungsmethode für eine Instanz vom Typ Website und nicht für den Typ selbst aufrufen, wie von Mark erwähnt.

Zu Ihrer Information, Zusätzlich zu dem, was Mark sagte, wird der Code wie unten beim Kompilieren konvertiert.

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


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

Ein improved version der Extension-Methode wäre die Art Webseite nur zu verlängern und nicht die 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

Sie benötigen die Unterschrift des Erweiterungsmethode ändern Ihre Enum zu verwenden, anstatt die Enum-Typ selbst. Das heißt, ändern Enum-Website in Ihrer Erweiterung Methodensignatur:

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