标志和| =运算符的类型参数的约束

安德烈·布什曼

我有枚举,用Flags属性标记枚举包含客户选择的变体。在控制台窗口中,用户可以指向单个变体,也可以指向一组必需的变体(数字),以逗号分隔。我的方法解析客户选择,并将其转换为枚举(标志集)的值。

我也有一组类似的枚举。因此,我想对一组枚举使用相同的代码。我不想复制相同的代码,因此将其放入通用方法中:

private static T GetVariants<T>() where T : struct, IConvertible 
{
    if (!typeof(T).IsEnum) {
        throw new ArgumentException("'T' must be an enumerated type.");
    }
    Dictionary<int, T> dict = new Dictionary<int, T>();
    // ...
    T cs = dict[0];
    // ...
    cs |= dict[n]; // Here is CS0019 error.
}

我收到编译错误:

错误CS0019:运算符'| ='不能应用于类型'T'和'T'的操作数

我该如何解决?

Xanatos

使用Expression一棵小树还不清楚您想要获得什么,但是

public static class Or<T>
{
    public static readonly Func<T, T, T> Do;

    static Or()
    {
        var par1 = Expression.Parameter(typeof(T));
        var par2 = Expression.Parameter(typeof(T));

        Expression or;

        if (typeof(T).IsEnum)
        {
            Type type = Enum.GetUnderlyingType(typeof(T));
            or = Expression.Convert(
                Expression.Or(
                    Expression.Convert(par1, type), 
                    Expression.Convert(par2, type)), 
                typeof(T));
        }
        else
        {
            or = Expression.Or(par1, par2);
        }

        Do = Expression.Lambda<Func<T, T, T>>(or, par1, par2).Compile();
    }
}

您可以使用如下代码:

[Flags]
public enum MyEnum
{
    Val1 = 1,
    Val2 = 2,
    Val3 = 4,
}

public static T OrTogether<T>()
{
    T ret = default(T);

    foreach (T val in (T[])Enum.GetValues(typeof(T)))
    {
        ret = Or<T>.Do(ret, val);
    }

    return ret;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

<=和>运算符作为函数参数

来自分类Dev

运算符+和float参数

来自分类Dev

参数绑定和IN运算符

来自分类Dev

向量运算符和类型转换

来自分类Dev

Java:运算符和类型转换

来自分类Dev

Swift运算符的类型和调用

来自分类Dev

向量运算符和类型转换

来自分类Dev

原始类型和 IN 运算符

来自分类Dev

错误:没有运算符匹配给定的名称和参数类型

来自分类Dev

错误:没有运算符匹配给定的名称和参数类型

来自分类Dev

没有运算符匹配给定的名称和参数类型:需要转换什么?

来自分类Dev

PostgreSQL 过程:“没有运算符匹配给定的名称和参数类型”

来自分类Dev

没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换

来自分类Dev

原始类型和包装类型数组的instanceof运算符

来自分类Dev

了解正则表达式标志和按位运算符

来自分类Dev

避免对泛型类型参数使用==和!=运算符,但可以将其与null进行比较吗?

来自分类Dev

运算符重载传递和返回的参数

来自分类Dev

运算符重载和不同的模板参数

来自分类Dev

C-函数参数和“ <<”运算符

来自分类Dev

赋值运算符的下沉参数实现和语言缺陷

来自分类Dev

用于字符串参数的Javascript *和*运算符

来自分类Dev

运算符重载和不同的模板参数

来自分类Dev

重定向运算符,标准输入和命令参数

来自分类Dev

Bash:算术扩展,参数扩展和逗号运算符

来自分类Dev

Java条件运算符和不同类型

来自分类Dev

重载函数调用运算符和返回类型

来自分类Dev

运算符*未为char和string类型定义

来自分类Dev

SQLAlchemy:运算符LIKE和自定义类型

来自分类Dev

类型运算符的顺序和种类要求

Related 相关文章

热门标签

归档