c# - 通用枚举类型扩展方法的随机枚举值
问题描述
我想为任何从该枚举返回随机值的枚举编写扩展方法,目前我得到了这个:
class Monster
{
public enum presets
{
//some values
}
presets p = presets.randomEnum();
}
public static class Extensions
{
public static T randomEnum<T>(this T en) where T : struct , IConvertible , IEnumerable<Enum>
{
if (!typeof(T).IsEnum) { throw new Exception("random enum variable is not an enum"); }
Array values = en.ToArray();
return (T)values.GetValue(Random.Next(values.Length));
}
}
但是当我做presets.randomEnum()
Visual Studio 19 时告诉我 Error CS0117 'Monster.presets' does not contain a definition for 'randomEnum'
注意:我不得不为那个 ext 方法做很多谷歌搜索,所以如果有一个我错过或只是没有想到的更简单的方法,我非常感谢
解决方案
扩展方法必须定义在类的顶部(即在命名空间内但不在另一个类中)。此外,你不能对它有那个 IEnumerable 约束,它太多了。这对我有用:
public enum Presets
{
Test,
Test2
}
public static class Extensions
{
public static T RandomEnum<T>(this T en) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) { throw new Exception("random enum variable is not an enum"); }
var random = new Random();
var values = Enum.GetValues(typeof(T));
return (T)values.GetValue(random.Next(values.Length));
}
}
推荐阅读
- android - Flutter TextField Android 隐藏/恢复持久值
- asp.net-core - 未调用 ASP.NET Core 3 中依赖注入服务的具体实现
- ruby - 为什么这个类定义会导致 NoMethodError?
- python - 为什么当我尝试查找每行具有最大值的列名时,`idxmax` 会引发错误?
- html - CSS:悬停选择器不适用于按钮
- jquery - 如何使用 jQuery 更改 React 文本输入的值?
- python-3.x - 使用lambda表达式获取python中字符串中所有字符出现的索引
- mysql - MySql 将长日期格式字符串(例如 2001 年 3 月 20 日)转换为日期 YYYY-MM-DD
- mysql - 我正在尝试从 2 个表中访问数据库中的项目,但每个组最多只能获得 3 个
- javascript - 在 JavaScript 中以不同的方式返回对象,一种有效,另一种无效