繁体   English   中英

通用枚举类型扩展方法的随机枚举值

[英]random enum value for a generic enum type extension method

我想为任何从该枚举返回随机值的枚举编写扩展方法,目前我得到了这个:

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));
        }
    }

你的扩展方法看起来不错(我没有测试,我在我的手机上),但你的模板不太正确。 你有太多的限制。

你基本上是说..

  1. 通过放置where T : struct你是说参数必须是不可为空的类型(枚举不可为空,这里很好..)

  2. where T: IConvertible参数必须实现IConvertible接口( enum实现IConvertible 。这里很好)

  3. where T : IEnumerable<enum>您的 enum 似乎没有显式实现IEnumerable接口,并且默认情况下它没有实现 - 它不符合您对方法强加的参数要求。

编辑:我建议您删除IEnumerable<enum>约束,因为它是不必要的。

查看枚举: https : //docs.microsoft.com/en-us/dotnet/api/system.enum? view = netcore- 3.1

请参阅类型参数的约束: https : //docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM