2015-03-04 29 views
6

Ben bir nesnenin özellik Color bu bir benzeyen bir numaralandırma döndürdüğünü bilmek varsayalım:Özellik C# daki dinamikten alındığında enum özelliğini nasıl kontrol ederim?

enum ColorEnum { 
    Red, 
    Green, 
    Blue 
}; 

ve bilinmeyen tip spesifik bir nesne (I Color özelliğine sahiptir biliyorum) Color kümesine sahip olduğunu kontrol etmek istiyorum Red.

ObjectType thatObject = obtainThatObject(); 
if(thatObject.Color == ColorEnum.Red) { 
    //blah 
} 

Sorun ColorEnum ile derlemesine yoktur ve nesne türünü bilmiyorum: Bu benim nesne türünü bilselerdi ne yapardım olduğunu.

Bunun yerine aşağıdaki kurulum var:

dynamic thatObject = obtainThatObject(); 

ve nesne türünü (ve numaralandırma türü) bilmiyorum çünkü döküm olamaz. Color'u nasıl kontrol etmeliyim?

if(thatObject.Color.ToString() == "Red") { 
    //blah 
} 

çalışır ama ben "Günlük WTF" gördüğüm kargo kült kodunun en kötü örneklerinden benziyor.

Denetimi nasıl düzgün yaparım?

+0

enum yan montaj tipi ve sayısal temsiller tüm olası değerleri biliyor musunuz? –

+0

@YohDeadfall Buna güvenmemi tercih ediyorum - kimse orada neyin değiştiğini bilmiyor. – sharptooth

+0

'getThatObject()' (ve dönüş tipi) üzerinde etkiniz var mı? – stefankmitph

cevap

1

özelliklerini almak:

enum ColorEnum 
{ 
    Red, 
    Green, 
    Blue 
}; 

Bunu biliyoruz Kırmızı Var, ama diğer renkler hakkında hiçbir şey. Bu yüzden derlememizde enumuzu sadece bilinen değerlerle yeniden tanımlarız.

public static KnownColorEnum? GetKnownColor(object value) 
{ 
    KnownColorEnum color; 

    if (value != null && Enum.TryParse<KnownColorEnum>(value.ToString(), out color)) 
    { return color; } 

    return null; 
} 

Örnekler:

enum KnownColorEnum // in your assembly 
{ 
    Red 
}; 

nedenle ayrıştırmayı gerçekleştirebilir

// thatObject.Color == ColorEnum.Red 
// or 
// thatObject.Color == "Red" 
if (GetKnowColor(thatObject.Color) == KnownColorEnum.Red) // true 
{ } 

// thatObject.Color == ColorEnum.Blue 
if (GetKnowColor(thatObject.Color) == KnownColorEnum.Red) // false 
{ } 
+0

Bu, ToString() işlevini de kullanır. Bu sadece dize değişmezini karşılaştırmaktan nasıl daha iyidir? – sharptooth

+0

Sadece türleri kullanması daha iyidir. Tamsayı gösterimleri kullanamazsınız, çünkü ColorEnum değiştirilip altta yatan değerler de olabilir. Bu yüzden sadece bir yol dize coparison kullanmaktır. –

+0

Evet, 'TryParse()' kullanır ve paralel bir enum çıkarır. Bütün fark bu mu? – sharptooth

2

Nasıl öncelikle enum Renk özelliği ayrıştırma hakkında

if ((ColorEnum) Enum.Parse(typeof (ColorEnum), thatObject.Color.ToString()) == ColorEnum.Red) 
{ 
    // do something 
} 
+0

Montaj için referansım yok, yoksa ColorEnum'a gönderirim ve karşılaştırırdım. – sharptooth

+0

Ancak, derlemenizi yeniden tanımlayabilir ve kullanabilirsiniz :) –

+0

@YohDeadfall Hayır, yapamıyorum çünkü bunlar iki farklı enum olacak. – sharptooth

0

olası bir (alışılmışın dışında) yoludur: (bu uzantı yöntemi ile) bir ExpandoObject olmak (her ne ise nesne) dinamik nesne zorla:

public static dynamic ToDynamic(this object value) 
    { 
     IDictionary<string, object> expando = new ExpandoObject(); 

     foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType())) 
      expando.Add(property.Name, property.GetValue(value)); 

     return expando as ExpandoObject; 
    } 

sizin obtainedObject dönüştürün:

var obtainedObject = (object)obtainThatObject(); 
var myexpando = obtainedObject.ToDynamic(); // now you have an ExpandoObject 

Yani yapabilirsiniz Yan montajında ​​... Bir IDictionary

IDictionary<string, object> dictionary= (IDictionary<string, object>) myexpando; 
if(dictionary.ContainsKey("Color")) 
{ 
    var myValue = dictionary["Color"]; 
    string color = myValue.ToString(); 
    if(color == "Green") 
    { 
     // blah 
    } 
} 

kaç olduğunu nesne umurumda gerekmez bu şekilde gidiş

+1

Vay! Bu nasıl daha iyidir? .Color.ToString() == "Yeşil" '? – sharptooth

+0

Yapma 'if (dictionary.ContainsKey (" Renk ")) {var myValue = sözlük [" Renk "];'; bunun yerine ['Sözlük .TryGetValue'] kullanın (https://msdn.microsoft.com/en-us/library/bb347013 (v = vs.110) .aspx). – BCdotWEB