如何在ObjectScript中使用标志?

时间:2012-10-09 15:51:54

标签: c# intersystems-cache objectscript

在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方法?

1 个答案:

答案 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)