通用枚举类型扩展方法的随机枚举值
random enum value for a generic enum type extension method
我想为 任何枚举 编写一个扩展方法,returns 来自该枚举的随机值,目前我得到了这个:
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 方法做很多谷歌搜索,所以如果有更简单的方法我错过了或只是没有想到,我非常感谢它
扩展方法必须在 class 的顶部定义(即在命名空间内部但不在另一个 class 中)。另外,你不能对它有 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));
}
}
你的扩展方法看起来不错(我没有测试,我在我的手机上),但你的模板不太正确。你的约束太多了。
你基本上是在说..
通过输入 where T : struct
你是说参数必须是 non-nullable 类型(枚举不可为空,这里很好..)
where T: IConvertible
参数必须实现IConvertible
接口(enum
实现IConvertible
。这里很好)
where T : IEnumerable<enum>
看来你的枚举并没有显式实现 IEnumerable
接口,而且默认没有实现——不符合参数您对方法施加的要求。
编辑:我建议您删除 IEnumerable<enum>
约束,因为它是不必要的。
查看枚举:
https://docs.microsoft.com/en-us/dotnet/api/system.enum?view=netcore-3.1
我想为 任何枚举 编写一个扩展方法,returns 来自该枚举的随机值,目前我得到了这个:
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 方法做很多谷歌搜索,所以如果有更简单的方法我错过了或只是没有想到,我非常感谢它
扩展方法必须在 class 的顶部定义(即在命名空间内部但不在另一个 class 中)。另外,你不能对它有 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));
}
}
你的扩展方法看起来不错(我没有测试,我在我的手机上),但你的模板不太正确。你的约束太多了。
你基本上是在说..
通过输入
where T : struct
你是说参数必须是 non-nullable 类型(枚举不可为空,这里很好..)where T: IConvertible
参数必须实现IConvertible
接口(enum
实现IConvertible
。这里很好)where T : IEnumerable<enum>
看来你的枚举并没有显式实现IEnumerable
接口,而且默认没有实现——不符合参数您对方法施加的要求。
编辑:我建议您删除 IEnumerable<enum>
约束,因为它是不必要的。
查看枚举: https://docs.microsoft.com/en-us/dotnet/api/system.enum?view=netcore-3.1