在C#中从动态获取属性时,如何检查枚举属性?

时间:2015-03-04 11:42:49

标签: c# .net dynamic enums late-binding

假设我知道对象的属性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
}

确实有效,但它看起来像我在“The Daily WTF”中看到的货物崇拜代码中最糟糕的例子。

如何正确检查?

3 个答案:

答案 0 :(得分:2)

如何首先将Color属性解析为枚举

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

答案 1 :(得分:1)

在侧组件中:

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
{ }

答案 2 :(得分:0)

一种可能的(非正统)方式是:强制您的动态对象(无论它是什么对象)是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
    }
}
走这条路,你不必关心它是什么对象......