使用基于标记的.NET枚举从Lua中获取枚举。

我正在使用LuaInterface for .NET创建Windows表单对象。这项工作很好,除了一件事:

我想使用ControlAnchor属性使它们自动调整大小。如果我仅设置一个Anchor(例如仅设置AnchorStyles.Top),它是有效的,但这并没有太多意义。我必须设置多个Anchor,这通过使用“按位或”组合它们来完成(或仅以数字方式添加它们)。

在VB.Net中,两者都可以工作:

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

在Lua中,这做到了:

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.LuaException:尝试执行算术运算
字段'Top'(用户数据值)

这在某种意义上是正确的,因为“LuaInterface将枚举值视为相应枚举类型的字段”(LuaInterface:用Lua编写.NET CLR脚本 )。


也不可能将值分配为数字:

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

这一次,错误消息非常不具体:

LuaInterface.LuaException:函数

我该如何解决这个问题?

在Lua中有可能将数字转换为正确的枚举类型吗?

原文链接 https://stackoverflow.com/questions/9318489

点赞
stackoverflow用户562836
stackoverflow用户562836

我终于想通了如何做到这一点。 我使用了System.Enum的ToObject方法。 它需要我想要转换成的枚举类型和要使用的整数值。

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

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

您可以像这样使用它:

Label1 = luanet.System.Windows.Forms.Label()
Label1.Anchor = Anchor(AnchorLeft + AnchorTop + AnchorRight + AnchorBottom)
2012-02-24 19:27:35