System.Enum sınıfı
Enum Sınıfı yazısına taşıdım.
System.Enum'u Int'e Çevirmek
1. Enum'a atanan değer, derleme zamanında bilinen bir sabit değer olmalı (compile time constant). Aşağıdaki kod çalışmaz.
İnsanoğlu sürekli merak ettiği için bazı kişiler enum'a aynı değeri atayarak şu denemeyi yapmışlar.
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.
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.
Anotasyonu string'e çevirmeyi gösteren kod eklemem lazım.
Enum'a annotation atanabilir.
enum Type
{
[Description("One")]
value1 = 1
}
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.
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
Örnek'te diğer numeric tiplerden de kalıtılabildiği gösteriliyor.
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
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.By default the underlying data type of an enumeration is int
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 İşlemlerJava'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ğer1. 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.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.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.
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