首页 > 解决方案 > 将 enum 作为函数参数传递,将其作为 int 处理,并返回 enum

问题描述

描述

我有一个名为的函数HandleEnum,它接受一个enumas parameter e,我需要eenumto转换int并根据它的 int 值执行一些操作。最后,我需要将其转换回enum并返回。(这个要求可能看起来有点奇怪,因为它只是我真正问题的抽象)。

方法一:通用

我尝试过使用generic,它确实有帮助:

static object HandleEnumViaGeneric<T>(T e)
{
    int x = (int)(object)e + 1;
    return (T)(object) x;
}

它可以像下面这样调用:

enum Color { black, red, green };
enum Day { day1, day2, day3, day4 };

static void Main(string[] args)
 {
    Console.WriteLine(HandleEnumViaGeneric(Day.day3).GetType());
    Console.WriteLine(HandleEnumViaGeneric(Color.black).GetType());
 }

方法2:反射

同时,我试图用reflection做同样的事情,但它失败了:

static object HandleEnumViaReflection(object e)
{
    int x = (int) e + 1;
    return Activator.CreateInstance(e.GetType(), x);
}

当我调用:Console.WriteLine(HandleEnumViaReflection(Color.black).GetType());时,抛出了一个异常:找不到类型'TestEnum.Color'的构造函数。(TestEnum 是我的命名空间)。

我的问题

这是我的问题:

  1. 第二种方法如何工作?
  2. 为了满足我的要求,哪种方法更好或都不是好方法?

谢谢。

标签: c#enumsgeneric-programmingsystem.reflection

解决方案


方法 2 不起作用,因为您使用的是CreateInstance(Type, Object[]),其中参数必须与构造函数匹配,并且您的对象是枚举。我建议您采用第一种方法,因为我认为不可能实施第二种方法。

// Summary:
//     Creates an instance of the specified type using the constructor that best
//     matches the specified parameters.

简而言之,Activator.CreateInstance仅适用于具有构造函数的对象。


推荐阅读