簡體   English   中英

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM