我有一個懸而未決的問題,但我已經嘗試了很多解決方案,但沒有一個真正令人滿意我會說所以希望這里有人知道我是否缺少一些解決方案。
正如你在下面看到的,我有一個類ExposedMethod,它定義了一個可以呼叫的方法(只是為了澄清,它不是一個實際的 C# 方法,它是一個表示某些操作或任務的類)。此方法具有任意數量的潛在引數(當前所有引數型別都繼承自基類引數,該引數僅具有 ToString() 和 Validate() 方法。

所有這些都應該沒問題。當您查看繪圖的底部時,我的問題就出現了,在那里我還使用MethodCall封裝了對ExposedMethod的呼叫。我希望此呼叫包含應為ExposedMethod 中定義的引數提供的值。我不知道如何確保提供的 Call 型別與引數的型別相匹配。假設我有一個ExposedMethod,它有 2 個引數Name和Id,分別是String ParamType和Int ParamType型別。如何設計我的MethodCall 類,以便Name的值 只能在編譯時作為字串提供(我真的想避免在運行時手動進行檢查)。
到目前為止,我已經嘗試過:
- 使 ParameterDefinition 通用(所以 ParameterDefinition where T : ParamType,但是,afaik,需要我在 Exposed Method 中有 N 個不同的串列(每個 ParamType 一個),如果我必須在某個時候添加更多型別,這有點難看。但是這似乎是“最簡單”的方法。
- 沒有泛型,只是在 ParameterDefinition 中有一個 ParamType,然后在 MethodCall 中有一個 < int , ParameterValue >的字典,其中鍵是我要為其設定值的引數的 id,而 ParameterValue 是實際值。然而,這需要我手動檢查 ParameterValue 實際上具有正確的型別。
我意識到對此可能沒有很好的解決方案,但 ExposedMethod 和 MethodCall 的概念是我設計中不可或缺的一部分,所以我希望盡可能少出現令人討厭的驚喜。
希望有人有過類似的經驗,并且知道如何確保 params 和 args 匹配,或者至少可以告訴我我是否完全走錯了方向:)
uj5u.com熱心網友回復:
然而,這需要我手動檢查 ParameterValue 實際上具有正確的型別
無論如何,這就是您最終需要做的事情。對于任何“MethodCall”實體,如果您不使用繼承(如“FooStringIntMethodCall”表示帶有字串和 int 引數的“Foo”方法),編譯器不知道第一個“ParameterValue”必須是 StringParameter .
只是你的域恰好代表了編譯器(/lexer/parser)知道的東西,并不意味著編譯器可以幫助你處理你的域。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/378972.html
