相关疑难解决方法(0)

C#中的枚举类型约束

可能重复:
任何人都知道缺少枚举通用约束的好方法?

C#不允许对Enums 进行类型约束的原因是什么?我确信疯狂背后有一种方法,但我想明白为什么不可能.

以下是我希望能够做到的(理论上).

public static T GetEnum<T>(this string description) where T : Enum
{
...
}
Run Code Online (Sandbox Code Playgroud)

.net c# enums

149
推荐指数
4
解决办法
5万
查看次数

任何人都知道缺乏枚举通用约束的好方法吗?

我想要做的是这样的:我有枚举标记值的枚举.

public static class EnumExtension
{
    public static bool IsSet<T>( this T input, T matchTo ) 
        where T:enum //the constraint I want that doesn't exist in C#3
    {    
        return (input & matchTo) != 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么我可以这样做:

MyEnum tester = MyEnum.FlagA | MyEnum.FlagB

if( tester.IsSet( MyEnum.FlagA ) )
    //act on flag a
Run Code Online (Sandbox Code Playgroud)

不幸的是,C#的通用,其中约束没有枚举限制,只有类和结构.C#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.

有没有人知道解决方法?

.net c# enums flags

87
推荐指数
6
解决办法
2万
查看次数

具有整数约束的C#泛型方法拒绝从整数强制转换为泛型类型

如果我有一个被限制为类型'int'的泛型方法,那么我当然应该能够将一个整数转换为泛型T类型.例如...

    public T ExampleMethod<T>(int unchanged) where T : int
    {
        return (T)unchanged;
    }
Run Code Online (Sandbox Code Playgroud)

...编译器抱怨无法将类型'int'转换为'T',但我有一个约束,表明目标是整数.那肯定应该有用吗?

更新:

实际情况是我想要一个返回枚举值的辅助方法.所以我理想的助手方法会更像这样....

public T GetAttributeAsEnum<T>(XmlReader reader, string name) where T : enum
{
    string s = reader.GetAttribute(name);
    int i = int.Parse(s);
    return (T)i;
}
Run Code Online (Sandbox Code Playgroud)

......并像这样使用它......

StateEnum x = GetAttributeAsEnum<StateEnum>(xmlReader, "State");
CategoryEnum y = GetAttributeAsEnum<CategoryEnum>(xmlReader, "Category");
OtherEnum z = GetAttributeAsEnum<OtherEnum>(xmlReader, "Other");
Run Code Online (Sandbox Code Playgroud)

......但你无法通过枚举来约束.

c# generics

2
推荐指数
1
解决办法
6162
查看次数

标签 统计

c# ×3

.net ×2

enums ×2

flags ×1

generics ×1