在 类 中封装参数和参数

Encapsulating Parameters and Arguments in classes

我有一个悬而未决的问题,但我已经尝试了很多解决方案,其中 none 我真的很满意我想说的是希望这里有人知道我是否遗漏了一些解决方案。

正如您在下面看到的,我有一个 class ExposedMethod,它定义了一个可以调用的方法(澄清一下,它不是实际的 C# 方法,它是一个 class 代表一些操作或任务)。此方法具有任意数量的潜在参数(当前所有参数类型都继承自 baseclass 参数,它只有一个 ToString() 和 Validate() 方法。

一切都应该没问题。当您查看绘图的底部时,我的问题就出现了,在那里我还使用 MethodCall 封装了对 ExposedMethod 的调用。我希望此调用包含应为 ExposedMethod 中定义的参数提供的值。我不知道如何确保提供的调用类型与参数类型匹配。假设我有一个 ExposedMethod,它有 2 个参数 NameId 类型 String ParamTypeInt ParamType 分别。我如何设计 MethodCall class 以便 Name 的值只能在编译时作为字符串提供(我真的希望避免在运行时手动进行检查)。

到目前为止我已经尝试过:

  1. 使 ParameterDefinition 通用(所以 ParameterDefinition 其中 T:ParamType,但是,afaik,要求我在 Exposed Method 中有 N 个不同的列表(每个 ParamType 一个),如果我必须在一些点。然而,这似乎是“最简单”的方法。
  2. 没有泛型,只是在 ParameterDefinition 中有一个 ParamType,然后在 MethodCall 中有一个 <intParameterValue> 的字典,其中key 是我要为其设置值的参数的 id,ParameterValue 是实际值。然而,这需要我手动检查 ParameterValue 是否具有正确的类型。

我意识到这可能没有很好的解决方案,但 ExposedMethod 和 MethodCall 的概念是我设计中不可或缺的一部分,所以我希望尽可能少地出现令人讨厌的意外。

希望有人有过类似的经验,并且知道如何确保参数和参数匹配,或者至少可以告诉我我是否完全走错了方向:)

This however requires me to check manually that the ParameterValue actually has the correct type

无论如何,这就是您最终需要做的事情。对于任何“MethodCall”实例,如果您不使用继承(例如“FooStringIntMethodCall”表示带有字符串和 int 参数的“Foo”方法),编译器不知道第一个“ParameterValue”必须是 StringParameter .

仅仅你的域恰好代表编译器 (/lexer/parser) 知道的东西,并不意味着编译器可以帮助你处理你的域。