美好的一天。 不知道怎么说这个,但请留在我身边。 我有几个具有各种类型属性的类的实例。 我的用户(我工作的非常小的业务)希望对这些变量执行自定义计算,并在新的DGV列中显示结果。 例如
DGV1使用list(of Myclass)作为数据源。列将自动添加而不是预定义。
一个用户想出了他们想要在dgv1上看到的属性。 他决定这个新的财产应该是结果 (Myclass.property1 - Myclass.property2)
我从来没有做过这种事情,也不知道从哪里开始。我知道我不可能硬编码每个可能的属性组合。此外,用户可以预见到他们需要的每种组合。
它基本上需要像excel一样灵活。 我有一个logictree样式自定义过滤器构建器,用于对这些对象的属性进行排队。一些用户还希望能够将这些自定义属性用作过滤器中的节点。
我甚至不确定是否有办法在运行时向类中添加属性,并且其行为与硬编码的属性相同。
我很感激你对此事的想法和建议。此外,如果我不清楚任何事情,那么我道歉。如果我需要澄清一些事情,请告诉我。 提前谢谢你。
*编辑# 我发现了Typebuiler并正在阅读它。
答案 0 :(得分:0)
没有真正的方法可以在运行时向类添加属性。一旦创建了一个类,它基本上就是一成不变的。
但是,您可以使用Dictionary(Of String,Object)来保存类中“属性”的名称和值。制作这样的所有属性,您可以模拟可添加和可移动属性。但这仅限于对象。
如果您还希望客户能够执行计算,则必须编写脚本引擎或使用脚本引擎。
我建议使用JavaScript引擎。使用JavaScript,您可以随时添加属性,并将JavaScript作为完整的脚本语言(JS不仅限于Web)。 我可以建议NiL.JS(https://github.com/nilproject/NiL.JS)作为引擎。它很快,您可以轻松地将对象从JS转换为.Net。
以下是如何使用它:
Dim o As New YourCustomObject() ' Your object (e.g. has a property x (double))
o.x = 5.0
Dim c As New Context() ' Create a new JS environment
c.DefineVariable("o").Assign(JSValue.Marshal(o)) ' Transfer the variable
c.Eval("o.x = 6.0;") ' Change the value in JS and it will change in .Net
MsgBox(o.x) ' 6.0
检索JS中添加的属性要困难一些,但这是可能的。我建议在GitHub页面查看示例。
我不知道Nil.JS的许可证,但那里有类似的引擎。