我有多种方法可以使用配置对象来填充模板中的占位符。不同的方法使用配置对象的属性的不同子集。我想要一种简单的方法来检查给定配置对象中是否存在给定方法使用的所有属性。
现在我有一个这样的方法:
private static void ValidateConfiguration(CustomerConfiguration config, params string[] properties)
这具有维护方面的缺点,即所使用的属性依赖于一组单独的字符串。我想做的是让验证方法查看调用方法,并查看正在访问config对象的哪些属性。能做到吗?
(我还可以将String.Replace()封装在用于检查null的方法中,但这并不那么有趣。)
答案 0 :(得分:0)
处理问题的一种类型安全的方法是实现具有不同有意义的属性子集的多个接口。我的理解是,案例中属性的存在与否取决于配置对象的类型,并且是动态的。
您可以使用这样的签名
ValidateConfiguration<T>(CustomerConfiguration config)
其中T
表示接口,并使用反射列出所需的属性。虽然实际上不可能解析一种方法的代码来推断其对数据结构的用法,但是对类型的反射(以提取属性)相当容易。
答案 1 :(得分:0)
不同的方法使用配置对象属性的不同子集。
如果仅创建配置属性的一个实例,则它需要具有的属性将是任何方法都将使用的属性。换句话说,如果至少一种方法需要该属性,则对象需要该属性。
在这种情况下,无需针对需要它的各个方法来对其进行验证。它的所有属性都需要填充,因为它们都需要放在某个地方。如果不需要它们,则可以将其删除。
然后,而不是根据特定方法的需求来验证该对象,而只需在启动时对其进行一次验证。所有属性都是必需的,因此,如果未指定它们,则该应用程序将无法运行。 (有时在配置对象中包括默认值是很好的。您可能希望拥有一个可以配置的属性,但在现实生活中,它永远不会改变。)
如果要创建同一对象的不同实例以用于不同方法,并且只想填充某些属性,则最好不要这样做。只需为包含您所需的所有属性的不同方案创建更多的粒度对象。
经常发生的事情是:我们有一个带有很多属性的对象,而我们只使用其中一些,所以我们填充这些属性并将该对象传递给方法。其他属性为null。
然后,修改该方法的人决定他们需要另一个属性,因此他们尝试使用它,并且惊讶地发现它为null。然后,他们必须返回并跟踪该对象的创建位置,并找出是否填充了该对象。那是令人困惑和耗时的。
除非字段是完全可选的,并且它们是否被填充都无关紧要,否则我们不想发现自己正在查看具有许多属性的对象并猜测已经填充了哪些属性,因为创建该属性的各个方法对象“知道”其他类需要或不需要的属性。