11 Şubat 2016 Perşembe

Enumeration

System.Enum sınıfı
Enum Sınıfı yazısına taşıdım.

System.Enum'u Int'e Çevirmek
İki yöntem var. İlki Convert.ToInt32 metodunu kullanmak
Enum data = ...
int Id = Convert.ToInt32(data); 
Diğeri ise int'e cast etmek.

Enum data = ...
int Id = (int)(data); 
System.Enum'u String'e Çevirmek
ToString metodu
Enum'un ToString() metodu kullanılabilir.
public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}
Bildiğimiz bir enum şöyle çevrilir.
myEnum.Lenovo.ToString()
Tüm enumların üzerinde dolaşarak key/value çiftlerine GetValues() metodunu kullarak şöyle çeviririz.
var brands = Enum.GetValues(typeof(myEnum))
                 .Cast<myEnum>()
                 .Select(x => new Brand(x.ToString(), (int)x))
                 .ToArray();
Enum'a atanan anotasyonu String'e Çevirmek
Enum'a annotation atanabilir.
enum Type 
{ 
    [Description("One")]
    value1 = 1 
}
Anotasyonu string'e çevirmeyi gösteren kod eklemem lazım.

Enum'u Kalıtmak
C#'ta enum numeric bir type gibi düşünülmeli. enum sınıfı default olarak int sınıfından kalıtır.
By default the underlying data type of an enumeration is int
Mesela Days enum'unu byte türünden kalıtabilirdik. Ağdan enum'u gönderirken, veritabanında enum'u saklarken daha az yer kaplaması için bu yöntemi kullanabiliriz.

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Örnek'te diğer numeric tiplerden de kalıtılabildiği gösteriliyor.
public enum IntEnum : int
{
    A,
}

public enum ShortEnum : short
{
    A,
}

public enum ByteEnum : byte
{
    A,
}
Enum ve Matematiksel İşlemler
Java'da enum numeric bir tip değildir! C#ta enum numeric olduğu için matematiksel işlemler yapılabilir. Yani aşağıdaki kod çalışır
var day = DayOfWeek.Sunday;
foreach(var n in Enumerable.Range(0, 7))
    Console.WriteLine("Day of week: {0}", day + n);

Enum ve Atanan Değer
1. Enum'a atanan değer, derleme zamanında bilinen bir sabit değer olmalı (compile time constant). Aşağıdaki kod çalışmaz.
enum RiskStates : long
{
  None = 0,
  AL = Convert.ToInt64(Math.Pow(2,0)),
}
Ancak aşağıdaki kod çalışır.
public enum SiteRoles
{
    User = 1 << 0,
    Admin = 1 << 1,
    Helpdesk = 1 << 2
}
Şöyle de yapamayız.
[Flags]
internal enum RiskStates : long
{
  None = 0,
  AL = Convert.ToInt64(Math.Pow(2,0)),
  ...
}
2. Bu değer bir kere atandıktan sonra değiştirilemez. Yani şöyle bir kod çalışmaz.
 enum Items { pen = 5, watch = 4, rubber = 1, ruler = 8};
Yeni bir değer atayamayız.
Items.watch = 6;
Enum'a Aynı Değeri Atamak - Synonyms
İnsanoğlu sürekli merak ettiği için bazı kişiler enum'a aynı değeri atayarak şu denemeyi yapmışlar.
enum MyEnum
{
    Left, Right, Top = 0, Bottom
}
Bu durumda Enum.ToString() metodunun hangi string'in döneceği belirsiz. Top stringini de dönebilir, Bottom stringini de dönebilir.
If multiple enumeration members have the same underlying value and you attempt to retrieve the string representation of an enumeration member's name based on its underlying value, your code should not make any assumptions about which name the method will return.
Enum'un synonyms değerlerini bulmak için şöyle yaparız. GetNames() ile tüm isimleri alırız. İsmi Enum'a çevirir ve belirtilen value ile Equals() ile karşılaştırırız.
public static IEnumerable<string> GetSynonyms(this Enum value)
{
  Type e = value.GetType();   

  return Enum.GetNames(e).Where(n => Enum.Parse(e, n).Equals(value));
}
Dolayısıyla şöyle kullanabiliriz. Bu durumda "Left" ve "Top" stringlerini alırız.
MyEnum.Top.GetSynonyms()


Hiç yorum yok:

Yorum Gönder