使用Lua中基于标志的.NET枚举

时间:2012-02-16 20:22:52

标签: c# .net vb.net lua luainterface

我正在使用LuaInterface for .NET来创建Windows窗体对象。除了一件事,这项工作非常好:

我想使用Anchor的{​​{1}}属性来自动调整大小。如果我只设置其中一个锚点(例如只有Control),它可以工作,但这并没有多大意义。我必须设置多个Anchor,这是通过将它们与“按位或”进行组合来完成的(或者通过在数字上添加它们来完成)。

在VB.Net中都有效:

AnchorStyles.Top

在Lua中,这确实有效:

Dim myLabel As New Label()
myLabel.Anchor = AnchorStyles.Top
myLabel.Anchor = AnchorStyles.Top + AnchorStyles.Left + _
                 AnchorStyles.Bottom + AnchorStyles.Right

...但是这个额外的行没有:

luanet.load_assembly("System.Windows.Forms")
local WinForms = luanet.System.Windows.Forms
local myLabel = WinForms.Label()
myLabel.Anchor = WinForms.AnchorStyles.Top

它给了我以下错误:

myLabel.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Left + 
               WinForms.AnchorStyles.Bottom + WinForms.AnchorStyles.Right

这在某种意义上是正确的,因为“LuaInterface将枚举值视为相应枚举类型的字段”(LuaInterface: Scripting the .NET CLR with Lua表示)。


也无法将值指定为数字:

LuaInterface.LuaException: attempt to perform arithmetic on
field 'Top' (a userdata value)

这一次,错误消息非常不明确:

myLabel.Anchor = 15    -- 15 = 8 + 4 + 2 + 1 = Top+Left+Right+Bottom

我该如何解决这个问题?

是否有可能将数字强制转换为Lua 中正确的枚举类型

1 个答案:

答案 0 :(得分:0)

我终于想出了如何做到这一点。我使用了ToObject的{​​{1}}方法。它需要我想要将它转换为的枚举类型,以及要使用的整数值。

以下是我的帮助库中的代码片段:

System.Enum

你这样使用它:

local EnumToObject, WinFormsAnchorStylesType = 
                luanet.get_method_bysig(luanet.System.Enum, "ToObject",
                                             "System.Type", "System.Int32"),
                luanet.System.Windows.Forms.AnchorStyles.Top:GetType()

AnchorTop, AnchorLeft, AnchorRight, AnchorBottom = 1, 4, 8, 2

function Anchor(flags)
  return EnumToObject(WinFormsAnchorStylesType, flags)
end