在C#中允许这样做:
[Flags]
private enum PermissionType
{
Read = 0x0001,
Write = 0x0002,
Execute = 0x0004,
All = Read | Write | Execute
}
这允许:
private bool TestPerm(PermissionType p)
{
if( PermissionType.Read & p) return true; // user can read
if( PermissionType.Write & p) return true; // user can write
if( PermissionType.Execute & p) return true; // user can Execute
//etc
}
可以像这样调用:
Testperm( PermissionType.Read | PermissionType.Write );
我知道ObjectScript中没有枚举数据类型,但我认为具有这种属性的常规类应该有效......
Class Sample.AcknowledgeType Extends %RegisteredObject
{
Property Read As %Integer [ InitialExpression = 1 ];
Property Write As %Integer [ InitialExpression = 2 ];
Property Execute As %Integer [ InitialExpression = 4 ];
Property All As %Integer [ InitialExpression = 7 ];
}
这是我得到的。我该如何编写TestPerm方法?
答案 0 :(得分:2)
它不起作用。
您在对象上定义的每个属性在每个实例中使用内存中的字段(如果它是持久类,则在磁盘上)。因此,您可能需要为read,write,execute和all定义一个类参数,而不是使用初始表达式定义属性。
此外,缓存对象脚本是超集的MUMPS语言不会让你烦恼。语言的扩展允许这个 - $ BIT内置函数。这将获取/设置字符串中指定位置的位串值。
因此,您可以尝试:
Parameter READ=1;
Parameter WRITE=2;
Parameter EXECUTE=3;
Method TestPerm(Permissions as %String) as %Boolean
{
If $BIT(Permissions,..#READ) Quit 1
If $BIT(Permissions,..#WRITE) Quit 1
If $BIT(Permissions,..#EXECUTE) Quit 1
Quit 0
}
没有按位布尔运算符,这不是那么方便。情况变得更糟。
如果不使用%Dictionary包中的反射功能,实际上无法从类外部访问类参数。这太难了太慢,所以可能最好的选择是用方法公开枚举值。
Method GetReadParameter()
{
Quit ..#READ
}
所以现在可以写:
Set $BIT(Permissions,MyObject.GetReadParameter())
Set $BIT(Permissions,MyObject.GetWriteParameter())
Set HasPermission=MyObject.TestPerm(Permissions)
所以,一旦我们完成了对代码之美的钦佩之后,可能是时候承认没有原生的按位布尔运算符,这个C#成语就不值得了。而只是创建一个Permissions类,使用布尔属性Read,Write和Execute。 “全部”可以是计算属性。
如果你真的想要你可以创建一个具有Read,Write,Execute和All的Permissions类,每个类都是布尔值和计算的。您可以编写访问私有属性的getter和setter方法,并使用$ BIT来设置和读取值。但是你的布尔逻辑会与返回的值一起发生,而不是
Testperm( PermissionType.Read | PermissionType.Write );
你会做的
If (myPermissions.Read || myPermissions.Write)