多个装配中的动态类型铸造行为

时间:2011-12-27 23:01:53

标签: c# dynamic .net-4.0

在我的程序中,我使用枚举来表示对象的当前状态。我希望能够逐个遍历这个枚举的值。枚举值在数值上是连续的并且从0开始的事实是给定的。

在尝试编写一个递增枚举的函数时,如果已经到达结尾则循环已经产生了问题。

public static TEnum IncrWrap<TEnum>(TEnum value)
{
    int len = Enum.GetNames(typeof(TEnum)).Length;
    dynamic wrapper = value;
    dynamic newValue = ((int)wrapper + 1) % len;
    return (TEnum)newValue;
}

如果IncrWrap方法与调用它的对象存在于同一个程序集(项目)中,则它可以正常工作。但是,如果我将它移动到另一个项目(更高的位置,以便更多东西可以使用它)并从dll调用它,当我尝试将RuntimeBinderException转换为{时,我会得到wrapper {1}}消息“无法将类型'System.Enum'转换为'int'”。

什么事?我不明白为什么从不同的程序集调用函数会导致函数表现得如此不同。有什么关于int我不明白的事情吗?不必使用反射就可以做到这一点。

1 个答案:

答案 0 :(得分:1)

不幸的是,枚举在这里造成了一些问题。首先,枚举可以具有除char之外的任何整数类型。其次,无法保证枚举的增量值会逐渐增加。最后,C#语言不支持System.Enum的泛型类型约束,这会有所帮助。尽管如此,我相信你可以用不同的方式解决你的问题:

public static TEnum NextEnum<TEnum>(TEnum value)
{
    if (!typeof(TEnum).IsEnum)
        throw new ArgumentException("Expected type of System.Enum", "value");

    var values = Enum.GetValues(typeof (TEnum));
    var index = Array.IndexOf(values, value);
    return (TEnum)Enum.ToObject(typeof (TEnum), values.GetValue((index + 1) % values.Length));
}

我真的很惊讶您能够使用动态解决方案来实现这一目标。