c# - 将 enum 作为函数参数传递,将其作为 int 处理,并返回 enum
问题描述
描述
我有一个名为的函数HandleEnum
,它接受一个enum
as parameter e
,我需要e
从enum
to转换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 是我的命名空间)。
我的问题
这是我的问题:
- 第二种方法如何工作?
- 为了满足我的要求,哪种方法更好或都不是好方法?
谢谢。
解决方案
方法 2 不起作用,因为您使用的是CreateInstance(Type, Object[]),其中参数必须与构造函数匹配,并且您的对象是枚举。我建议您采用第一种方法,因为我认为不可能实施第二种方法。
// Summary:
// Creates an instance of the specified type using the constructor that best
// matches the specified parameters.
简而言之,Activator.CreateInstance
仅适用于具有构造函数的对象。
推荐阅读
- c# - 自动映射时是否可以展平对象的某些部分
- ruby-on-rails - Heroku json gem 安装失败
- php - 只有最后一个数组元素被正确写入
- javascript - Lodash:用值对象内部属性交换键
- php - 无法实现过滤功能(strtotime)
- sql-server - 通过子句提高相同分区的性能
- android - 在 ViewModel 和 Fragment/Activity 交互和通信之间应用 MVVM
- go - Golang 导入结构并共享所有应用程序
- loops - 汇编语言嵌套循环
- amazon-web-services - AWS - 我们可以将环境变量设置为在 Docker 中读取吗?