【问题标题】:Unable to invoke a method with generic enum type as parameter无法调用以泛型枚举类型作为参数的方法
【发布时间】:2013-02-19 16:05:30
【问题描述】:

我有一个辅助方法,可以将空格放入枚举名称中,如下所示。

 public static string GetListItemString(Enum listItem)
        {
            string result = string.Empty;

#region ELegalStatus
            if (listItem is ELegalStatus)
            {
                switch ((ELegalStatus) listItem)
                {
                    case ELegalStatus.PrivateLimited:
                        result = "Private Limited";
                        break;
                    case ELegalStatus.PublicLimited:
                        result = "Public Limited";
                        break;
                   }
             }
#endregion


#region ERegion
            if (listItem is ERegion)
            {
                switch ((ERegion) listItem)
                {
                    case ERegion.EnglandandWales:
                        result = "England and Wales";
                        break;
                    case ERegion.NorthernIreland:
                        result = "Northern Ireland";
                        break;
                    case ERegion.Scotland:
                        result = "Scotland";
                        break;
                }
            }
            #endregion 

      return result;
    }

我正在创建一个将枚举转换为列表的方法,如下所示。

public static object EnumToList<T>()
        {
            Type enumType = typeof (T);

            // Can't use type constraints on value types, so have to do check like this
            if (enumType.BaseType != typeof (Enum))
            {
                throw new ArgumentException("T must be of type System.Enum");
            }

            Array enumValArray = Enum.GetValues(enumType);

            foreach (var name in enumValArray)
            {
                var y = Enum.Parse(enumType, name.ToString().Trim(), true);                

               var x = ListHelper.GetListItemString(y);

            }

         return null;

        }

在上述方法中,当通用枚举的所有名称/值都被读入数组时,我想遍历它们中的每一个并调用方法“GetListItemString”以获取名称的适当间隔版本。

但是因为 'GetListItemString' 方法只接受一个 'Enum' 类型,它没有被编译。

我不确定如何在遍历枚举的名称/值时传递此方法所需的参数。

有人可以帮忙吗?

更新:我已经尝试过使用 var x = ListHelper.GetListItemString((Enum) y);

但使用 EnumToList() 调用 'EnumToList' 方法时,x 的值始终为空;

【问题讨论】:

    标签: c#-4.0 generics enums


    【解决方案1】:

    您只需将object 转换为Enum,因为出于某种原因,Parse 的返回类型为object

    var x = ListHelper.GetListItemString((Enum) y);
    

    您可能还想查看(并可能更改)我的Unconstrained Melody project,它提供了通用约束问题的解决方法。

    【讨论】:

    • 将 y 转换为 'Enum' 确实可以编译,但如果您调用类似 'EnumToList();' 的方法,'GetListItemString' 不会返回任何内容
    • @kranthi:嗯,它必须返回 something。你是说它返回一个空字符串?如果是这样,你真的应该开始调试它......你这样做比我们容易得多。逐行调试——事先检查y的值,等等。
    • 我调试了它。'GetListItemString'方法不认为将'y'转换为'Enum'的结果值属于'ELegalStatus'类型,并且不执行这种情况,因此为空字符串.
    • @kranthi:不清楚你的意思。你有没有检查y的值之前演员?如果转换失败,我预计会出现异常...(如果您可以将代码转换为简短但完整的示例,我很乐意尝试重现该问题。)
    • 不确定,为什么昨天没有工作。但是今天当我试图为你创建一个例子时,它开始工作了。据我所知,我没有做任何改变来让它工作。不管怎样,谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多