SORU
8 Ocak 2009, PERŞEMBE


C# String çeteleler

Aşağıdaki numaralandırma var:

public enum AuthenticationMethod
{
    FORMS = 1,
    WINDOWSAUTHENTICATION = 2,
    SINGLESIGNON = 3
}

Bu sorun, ancak kelime "FORM" ben AuthenticationMethod isteyin.ihtiyacım var FORMLARI ve Kimlik Numarası 1.

Bu sorun (link) için şu çözümü buldum:

Özel bir öznitelik oluşturun gerekiyor ilk"": . Çağrısı

public class StringValue : System.Attribute
{
    private string _value;

    public StringValue(string value)
    {
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }

}

O zaman benim numaralandırıcısı için bu özniteliği ekleyebilirsiniz:

public enum AuthenticationMethod
{
    [StringValue("FORMS")]
    FORMS = 1,
    [StringValue("WINDOWS")]
    WINDOWSAUTHENTICATION = 2,
    [StringValue("SSO")]
    SINGLESIGNON = 3
}

Ve tabii ki bir şeyler Çağrısı almak gerekir:

    public static class StringEnum
{
    public static string GetStringValue(Enum value)
    {
        string output = null;
        Type type = value.GetType();

        //Check first in our cached results...

        //Look for our 'StringValueAttribute' 

        //in the field's custom attributes

        FieldInfo fi = type.GetField(value.ToString());
        StringValue[] attrs =
           fi.GetCustomAttributes(typeof(StringValue),
                                   false) as StringValue[];
        if (attrs.Length > 0)
        {
            output = attrs[0].Value;
        }

        return output;
    }
}

Şimdi araçları tek bir kaptan için bir dize değeri almalıyım iyi. O zaman bu gibi kullanabilirsiniz:

string valueOfAuthenticationMethod = StringEnum.GetStringValue(AuthenticationMethod.FORMS);

Tamam bu işleri artık tüm cazibe gibi ama iş onun bütün sürü buluyorum. Eğer bu daha iyi bir çözüm olup olmadığını merak ediyordum.

Ben de sözlük ve statik özellikleri ile bir şeyler denedim ama o kadar iyi değildi.

CEVAP
8 Ocak 2009, PERŞEMBE


type-safe-enum desen deneyin.

public sealed class AuthenticationMethod {

    private readonly String name;
    private readonly int value;

    public static readonly AuthenticationMethod FORMS = new AuthenticationMethod (1, "FORMS");
    public static readonly AuthenticationMethod WINDOWSAUTHENTICATION = new AuthenticationMethod (2, "WINDOWS");
    public static readonly AuthenticationMethod SINGLESIGNON = new AuthenticationMethod (3, "SSN");        

    private AuthenticationMethod(int value, String name){
        this.name = name;
        this.value = value;
    }

    public override String ToString(){
        return name;
    }

}

Güncelleme (Veya) örtülü açık tür dönüşümü yapılabilir

  • statik alan eşleme ile ekleme

    private static readonly Dictionary<string, AuthenticationMethod> instance = new Dictionary<string,AuthenticationMethod>();
    
    • n.b. Sırayla başlangıcı olan "numaralama üyesi" alanları yok at bir NullReferenceException çağırırken örneği kurucu, emin olmak için bir Sözlük alan önce "numaralama üyesi" alanlarında sınıfı. Çünkü bu statik alan initialisers olarak adlandırılan, beyan ve sipariş önce statik oluşturucu oluşturma, tuhaf ve gerekli ama kafa karıştırıcı bir durum bu örneği kurucu çağrılabilir önce tüm statik alanlar olmuştur başlatıldığını ve daha önce statik oluşturucu denir.
  • olayda bu eşleme dolum yapıcı

    instance[name] = this;
    
  • ve ekleyerek 20**

    public static explicit operator AuthenticationMethod(string str)
    {
        AuthenticationMethod result;
        if (instance.TryGetValue(str, out result))
            return result;
        else
            throw new InvalidCastException();
    }
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • New Scientist

    New Scientis

    27 Kasım 2006
  • ThreadBanger

    ThreadBanger

    2 Mart 2007