[英]How do I check if a property exists on a dynamic anonymous type in c#?
[英]How do I check enum property when the property is obtained from dynamic in C#?
假設我知道對象的屬性Color
返回一個如下所示的枚舉:
enum ColorEnum {
Red,
Green,
Blue
};
我想檢查一個未知類型的特定對象(我知道有Color
屬性)將Color
設置為Red
。 如果我知道對象類型,這就是我要做的事情:
ObjectType thatObject = obtainThatObject();
if( thatObject.Color == ColorEnum.Red ) {
//blah
}
問題是我沒有使用ColorEnum
對程序集的引用,也不知道對象類型。
所以我有以下設置:
dynamic thatObject = obtainThatObject();
而我無法施放,因為我不知道對象類型(和枚舉類型)。 我該如何檢查Color
?
if( thatObject.Color.ToString() == "Red" ) {
//blah
}
確實有效,但它看起來像我在“每日WTF”中看到的貨物崇拜代碼中最糟糕的例子。
我該如何正確檢查?
如何首先將Color屬性解析為枚舉
if ((ColorEnum) Enum.Parse(typeof (ColorEnum), thatObject.Color.ToString()) == ColorEnum.Red)
{
// do something
}
在側組件中:
enum ColorEnum
{
Red,
Green,
Blue
};
我們知道Red存在,但沒有其他顏色。 因此,我們僅使用已知值重新定義程序集中的枚舉。
enum KnownColorEnum // in your assembly
{
Red
};
因此我們可以執行解析:
public static KnownColorEnum? GetKnownColor(object value)
{
KnownColorEnum color;
if (value != null && Enum.TryParse<KnownColorEnum>(value.ToString(), out color))
{ return color; }
return null;
}
例子:
// 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
{ }
一種可能的(非正統)方式是:強制您的動態對象(無論它是什么對象)是ExpandoObject(使用此擴展方法):
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;
}
轉換您獲得的對象:
var obtainedObject = (object)obtainThatObject();
var myexpando = obtainedObject.ToDynamic(); // now you have an ExpandoObject
因此,您可以在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
}
}
走這條路,你不必關心它是什么對象......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.