【问题标题】:Use flag-based .NET enums from Lua使用 Lua 中基于标志的 .NET 枚举
【发布时间】:2012-03-08 06:38:22
【问题描述】:

我正在使用 LuaInterface for .NET 创建 Windows 窗体对象。这很好用,除了一件事:

我想使用Control 的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: attempt to perform arithmetic on
field 'Top' (a userdata value)

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


也不能将值指定为数字:

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

这一次,错误信息相当模糊:

LuaInterface.LuaException: function

我该如何解决这个问题?

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

【问题讨论】:

  • @phoog:这不是重复的,因为问题不在于如何进行按位运算,而是将结果(无论是按位计算还是通过加法计算)转换为正确的枚举类型。我只是在这里使用了加法,因为它是直接内置在 Lua 中的,并且按位或不是。在 VB/C# 中,我也使用 or / |。

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


【解决方案1】:

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

以下是我的助手库中的代码 sn-p:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多