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

sha*_*oth 6 .net c# enums dynamic late-binding

假设我知道Color对象的属性返回一个如下所示的枚举:

enum ColorEnum {
   Red,
   Green,
   Blue
};
Run Code Online (Sandbox Code Playgroud)

我想检查一个未知类型的特定对象(我知道有Color属性)已Color设置为Red.如果我知道对象类型,这就是我要做的事情:

ObjectType thatObject = obtainThatObject();
if( thatObject.Color == ColorEnum.Red ) {
   //blah
}
Run Code Online (Sandbox Code Playgroud)

问题是我没有对程序集的引用,ColorEnum也不知道对象类型.

所以我有以下设置:

dynamic thatObject = obtainThatObject();
Run Code Online (Sandbox Code Playgroud)

而我无法施放,因为我不知道对象类型(和枚举类型).我应该怎么检查Color

if( thatObject.Color.ToString() == "Red" ) {
    //blah
}
Run Code Online (Sandbox Code Playgroud)

确实有效,但它看起来像我在"每日WTF"中看到的货物崇拜代码中最糟糕的例子.

我该如何正确检查?

Yoh*_*all 2

在侧面装配中:

enum ColorEnum
{
    Red,
    Green,
    Blue
};
Run Code Online (Sandbox Code Playgroud)

我们知道红色的存在,但不知道其他颜色。因此,我们仅使用已知值重新定义程序集中的枚举。

enum KnownColorEnum // in your assembly
{
    Red
};
Run Code Online (Sandbox Code Playgroud)

因此我们可以进行解析:

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

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

    return null;
}
Run Code Online (Sandbox Code Playgroud)

例子:

// 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
{ }
Run Code Online (Sandbox Code Playgroud)