0

我有一个小问题。这是我的问题的简化版本。

我有一个类,它有一个按钮列表及其名称(新建、编辑、删除)以及一个“类型”类型的对象

class test
{
    private List<Button> buttons; // 
    private Type type;

    public test(Type t)
    {
            this.type = t;
            /* some code to create the buttons from the enum. 
            got this already covered but "Restore" does not get created by intention*/
    }

    public void setButtons(int i)
    {

    }
}

类型是带有 flags 属性的枚举

[Flags] enum EnumTest{None=0, New=1, Edit=2, Delete=4, Restore=8}

我想做的是让“setButtons”方法创建一个“type”实例,将“int i”的值设置为标志值,浏览按钮列表并设置“Enabled”属性按钮取决于是否引发了标志,其中按钮“名称”属性取决于枚举中的标志名称(EnumTest 或任何其他)

我尝试了几种类似的东西

    var enu = Enum.ToObject(type, i);

但我无法设置标志,或者我不知道如何设置。我正在考虑在创建它时使用反射。似乎“ToObject”方法不能很好地与 flags 属性配合使用。“TryParse”似乎可以,但我不知道如何让它从“Type”动态加载。

请考虑到这是我的问题的高度简化版本,但它会保留意义。

4

1 回答 1

1

调用Enum.ToObject(...)时,System.Type参数应该是您尝试为其检索枚举值的枚举类型。

所以,你应该这样称呼它:

EnumTest myTestVar = (EnumTest)Enum.ToObject(typeof(EnumTest), i); // i is the integer to be converted to one of the enumeration values.

注意:这仅适用i于 中定义的值之一EnumTest。例如,如果i = 66 不是枚举成员之一,我认为上述方法不起作用,而是它的两个成员的组合。

HTH。

更新:

好吧,我在这里看到了两件事。我想也许你可以使用泛型来解决你的问题,但你不能Enum用作泛型类型参数的类型约束。(这就是我更喜欢 Java 枚举而不是 C# 枚举的地方。实际上,您可以在 Java 枚举中定义自己的自定义方法——C# 没有骰子。)这样就结束了。

我看到的另一个问题是建议使用的Enum.ToObject(Type t, int i)方法。方法摘要清楚地说“将指定的 32 位有符号整数转换枚举成员” [强调我的]。所以我不认为你可以传入,比如说6,并期望一个具有必要位字段集的枚举对象。MSDN上的文档似乎支持这一点。另请查看Enum.IsDefined方法的文档。最后,System.Enum还有一个可能对您有用的HasFlag方法。我认为这可能是您问题的根源。我从未尝试使用ToObject“复合”枚举值。

为什么不直接传入要启用的按钮列表:

class test
{
    private List<Button> buttons;

    public test() { /* Whatever constructor logic you need. */ }

    public void setButtons(List<Button> btnsToEnable)
    {
        btnsToEnable.ForEach(btn => btn.Enabled = true);

        // Or perhaps:
        buttons.Intersect(btnsToEnable).ToList().ForEach(btn => btn.Enabled = true);
   }
}

有多种方法可以使用 LINQ 来完成您想要的。这实际上取决于您的对象模型。希望这些想法能让您开始走上另一条适合您的场景的道路。

于 2013-05-29T17:34:16.640 回答