2010-06-09 34 views
9

ben gibi bir enum bir şey var ki bir arabirim uygulayan bir enum taklit etmek: Ben de arayüzünde görüntülenen değerleri çeki düzen vermek için benim enum bir uzantısı yöntemi oluşturdukDavranış

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

, bu yüzden var gibi bir şey:

: mükemmel yazı here esinlenerek

public static string ToDisplayString(this OrderStatus status) 
{ 
    switch (status) 
    { 
     case Status.AwaitingAuthorization: 
      return "Awaiting Authorization"; 

     case Status.InProduction: 
      return "Item in Production"; 

     ... etc 
    } 
} 

, ben bir uzantısı yöntemi ile bir SelectList benim çeteleler bağlamak istiyorumancak

, kullanıcı arayüzünde DisplayString değerlerini kullanmak Birlikte hiç çalışmamasına

: where TEnum has extension ToDisplayString

Açıkçası bunların hiçbiri gidiyor çizgisinde bir kısıtlama eklemek gerekiyordu açılır Güncel yaklaşım, bilmediğim akıllıca bir hile yok.

Böyle bir şeyi nasıl uygulayabileceğim konusunda herhangi bir fikri olan var mı? Tabii ki where TEnum : System.Enum

Eğer Enum kendisinde yöntemlerin bir demet olsun bu şekilde ve tip güvenliğini kaybetmek:

 
public static string ToOrderStatusDisplayString(this Enum status) 
{  
    switch ((OrderStatus)status) 
    { 
     ... 
    } 
} 

Sonra Enum TEnum kısıtlamak:

cevap

24

enum'u kullanmanın zorlayıcı bir nedeni var mı?

enum s kullanmak için çılgın çemberler üzerinden atlamaya başladığınızda, bir sınıf kullanmak için zaman olabilir.

public void AuthorizeAndSendToProduction(Order order, ProductionQueue queue) 
{ 
    if(order.Status != OrderStatus.AwaitingAuthorization) 
    { 
     Console.WriteLine("This order is not awaiting authorization!"); 
     return; 
    } 
    order.Status = OrderStatus.InProduction; 
    queue.Enqueue(order); 
} 

dize gösterimi yerleşik olduğunu ve tek ihtiyacınız ToString() geçerli:

public class OrderStatus 
{ 
    OrderStatus(string display) { this.display = display; } 

    string display; 

    public override string ToString(){ return display; } 

    public static readonly OrderStatus AwaitingAuthorization 
     = new OrderStatus("Awaiting Authorization"); 
    public static readonly OrderStatus InProduction 
     = new OrderStatus("Item in Production"); 
    public static readonly OrderStatus AwaitingDispatch 
     = new OrderStatus("Awaiting Dispatch"); 
} 

Bir enum olarak bunu aynı tüketir.

+0

Bu uygulamayı çok kullanıyorum. –

+0

Gerçekten güzel, teşekkürler –

+0

Parlak. Küçük uyarı: varsayılan değerleri kullanamazsınız veya " için varsayılan parametre değeri" derleme zamanı sabiti olmalıdır. – as9876

-3

Bunu yapabilirsiniz. "ToDisplayString" öğesini kullanmak yerine, enum'unuzun ToString() işlevini geçersiz kılmanız yeterlidir.

+1

[Nerede TEnum: Enum 'yazamazsınız] (http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660). – SLaks

+2

@SLaks: Oh evet, haklısın. Bana -1 ver, merhamet yok :) –

1

Eğer bir enum onu ​​geçersiz kılarsa, onu alacak, aksi takdirde varsayılan ToString davranışını (ToSelectList'de) alacaktır.