не может преобразовать тип long в T, здесь T - значение Enum - PullRequest
0 голосов
/ 19 ноября 2018
  T  bitmask = (T)PermissionBitMask;
  bool hasAccess = (bitmask & (T)operation) == (T)operation;

// здесь T - это длинное значение типа Enum, PermissionBitMask - длинное значение Enum, а операция - целочисленное значение.

public bool CheckAccess<T>(int operation) where T : Enum 
{ 
    bool hasAccess = false; 
    T bitmask = (T)_permission.PermissionBitMask; 
    hasAccess = bitmask & (T)operation == (T)operation; 
    return hasAccess; 
} 

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Учитывая, что перечисления являются конвертируемыми, вы можете ограничить IConvertible на T:

public bool HasAccess<T>(T permissionBitMask, long operation) where T: IConvertible
{
    long bitmask = permissionBitMask.ToInt64(null);
    return (bitmask & operation) == operation;
}

И если вы можете использовать C # 7.3, то также можно ограничить System.Enum.

0 голосов
/ 19 ноября 2018

Вы можете использовать метод Enum.ToObject () как:

    private static T IntegerToEnum<T>(int i)
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("...");
        }
        return (T)Enum.ToObject(typeof(T), i);
    }

и

    private static T LongToEnum<T>(long i)
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("...");
        }
        return (T)Enum.ToObject(typeof(T), i);
    }
...