2017-04-06 24 views
0

美好的一天。不知道如何說話,但請留在我身邊。 我有幾個類的各種不同屬性的幾個實例。 我的用戶(我工作的非常小的業務)想要對這些變量執行自定義計算,並將結果顯示在新的DGV列中。 例如允許最終用戶爲類創建自定義屬性。使這些屬性對DGV可見

DGV1使用列表(Myclass)作爲其數據源。列自動添加而不是預定義。

一位用戶認爲他們希望在dgv1上總能看到的屬性。 他決定這個新屬性應該是 (Myclass.property1 - Myclass.property2)結果

Iv'e從來沒有做過這樣的事情,並沒有任何線索從哪裏開始。我知道我不可能硬編碼每個可能的屬性組合。另外,用戶可以預見他們需要的每種組合。

它基本上需要像excel一樣靈活。 我有一個logictree風格的自定義過濾器生成器,用於對這些對象的屬性進行排隊。某些用戶還希望能夠將這些自定義屬性用作過濾器中的節點。

我甚至不確定是否有一種方法可以在運行時將某個屬性添加到類中,並且這種方式表現爲硬編碼的屬性。

我很感謝您對這件事的想法和建議。另外,如果我不清楚任何事情,那麼我表示歉意。如果我需要澄清某事,請告訴我。 謝謝,提前。

*編輯# 我發現了Typebuiler,我正在讀它。

回答

0

沒有真正的方法在運行時向類添加屬性。一旦創建了一個課程,它基本上就是一成不變的。

但是,您可以使用字典(字符串,對象)來保存類中「屬性」的名稱和值。使所有這樣的屬性,你可以排序模擬可添加和可移動的屬性。但是,這僅限於該對象。

如果您還希望您的客戶能夠執行計算,則必須編寫腳本引擎或使用腳本引擎。

我建議使用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的許可,但也有類似的引擎。