不能将 long 类型转换为 T,这里 T 是一个 Enum 的值
cannot convert type long to T, here T is an Enum's value
T bitmask = (T)PermissionBitMask;
bool hasAccess = (bitmask & (T)operation) == (T)operation;
//这里T是一个long值的Enum类型,PermissionBitMask是一个long值的Enum,operation是一个整型值。
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;
}
您可以使用 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);
}
考虑到枚举是可转换的,您可以将 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
进行约束。
T bitmask = (T)PermissionBitMask;
bool hasAccess = (bitmask & (T)operation) == (T)operation;
//这里T是一个long值的Enum类型,PermissionBitMask是一个long值的Enum,operation是一个整型值。
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;
}
您可以使用 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);
}
考虑到枚举是可转换的,您可以将 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
进行约束。