7

私はC#で始めたばかりですが、早い段階で問題が発生しました。ジェネリックGenericsを呼び出すにはどうすればよいですか?.HasFlag()Enum

public class Example<TEnum> where TEnum : struct {
}

どうすれば[Flags]属性を追加できますか?

4

1 に答える 1

8

インスタンスメソッドを呼び出すには、とにかくボクシングが必要になります。したがって、に制約することはできないため、Enumジェネリックスを破棄してを使用するだけEnumです。たとえば、次の代わりに:

void Something(TEnum enumValue, TEnum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

これを行う:

void Something(Enum enumValue, Enum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

一般的な方法では、次のような目標を達成できます。

void Something(TEnum enumValue, TEnum flags)
{
    Enum castValue = (Enum)(object)enumValue;
    Enum castFlags = (Enum)(object)flags;

    if (castValue.HasFlags(castFlags))
        //do something ...
}

列挙型ではない値型でメソッドを呼び出すと、実行時に例外がスローされます。typeパラメーターは値型を表すことがわかっているため、ValueTypeではなくviaを使用してキャストすることもできます。object

Enum castValue = (Enum)(ValueType)enumValue;
于 2012-03-01T16:13:32.843 に答える