2016-08-01 6 views
2

ich eine enum mit folgenden Erweiterungen haben:Enum Erweiterungen in allen Aufzählungen

public static class EnumExtension 
{ 
    public static SelectList ToSelectList(this Enum en) 
    { 
     var list = (from Enum d in Enum.GetValues(en.GetType()) 
       select new SelectListItem { Value = d.ToString(("d")), Text = Enum.GetName(en.GetType(), d) }).ToList(); 

     var selectedValue = (int) Enum.Parse(en.GetType(), Enum.GetName(en.GetType(), en)); 

     return new SelectList(list, "Value", "Text", selectedValue); 
    } 
} 

Hier ist die enum ich spreche:

public enum BillingInterval 
{ 
    Monthly = 1, 
    Quarterly = 2, 
    Yearly = 3 
} 

Mit diesem enum und die Erweiterung es möglich ist, zu folgendes tun

public ActionResult Test() 
{ 
    var vm = new CustomerViewModel(); 

    vm.BillingIntervalOptions = CustomerModel.BillingInterval.ToSelectList(); 
} 

Und jetzt mein Modus l hat ein SelectList enthält die Werte aus meiner enum

PROBLEM

Ich habe gerade einen anderen enum gemacht, und ich würde annehmen, dass diese enum würde die gleiche Ausdehnung haben, aber wenn ich versuche, die folgende, ich erhalten einen Compiler-Fehler:

public enum Status 
{ 
    Trial = 1, 
    Demo = 2, 
    Setup = 3, 
    Production = 4 
} 

public ActionResult Test() 
{ 
    var vm = new CustomerViewModel(); 

    vm.BillingIntervalOptions = CustomerModel.BillingInterval.ToSelectList(); 

    //This gives me a compile error 
    vm.StatusOptions = Status.ToSelectList(); 
} 

'Status' does not contain a definition for 'ToSelectList'

ich bin nicht ganz sicher, warum einer meiner enums die Erweiterungen b haben Aber das andere nicht.

Hinweis:das zweite Aufzählungs Status ist nicht in der gleichen Datei wie die BillingInterval Enum. Könnte das das Problem sein?

Antwort

5

CustomerModel.BillingInterval ist eine Eigenschaft, die einen Wert für die enum enthält. Status ist ein Typ, keine Instanz.

Da Erweiterungsmethoden nur für Instanzen und nicht für Typen funktionieren, schlägt die zweite Anweisung fehl.

2

Ihr Problem ist, dass Sie tatsächlich versuchen, mit type nicht mit enumobject interagieren. Es sollte sein:

var statusEnumInstance = Status.Trial; //here your instance 
vm.StatusOptions = statusEnumInstance.ToSelectList(); 

es in ersten Fall arbeitet becouse Sie yout CustomerModel Eigenschaft mit Enum-Objekt verweisen.