|
|
1
8
这不是个好主意像你描述的那样做是不合理的困难,即使你成功做到了,结果也无法维持。 困难源于对属性参数的限制:
很明显,将谓词压缩到上述任何类型中的唯一方法是编写一个字符串a-la SQL,例如。
然后,您需要在运行时解析这个字符串,将其转换为机器可用的形式并决定结果。即使这样,编写无效谓词也非常容易,因为该字符串对编译器来说是完全不透明的。 但也有其他选择您尝试的解决方案实际上是在试图与当前的相反——属性并不是用来封装运行时行为的。与其这样做,为什么不让您的可序列化类实现一个合适的接口呢?例如,您可以从沼泽标准开始
这可以完成任务,但也有一些缺点:
也具有编译时安全性如果上述情况不令人满意,可以通过消除前两个问题并以较小的运行时成本改进第三个问题来进行改进。这个想法基于 well-known trick to provide compile-time safety 当引用属性名时:将它们指定为成员访问表达式,而不是将其指定为字符串。
您可以将上述内容称为
因此,我们可以创建一个字典,将成员访问表达式映射到布尔函数,并提供一个相等比较器,用成员名称相等替换表达式的默认相等语义(引用相等):
这消除了问题#1(你不能再拼写错误的属性名了,编译器会发现的),它改进了#3(财产和条件更加明显)。它仍然没有解决第二个问题:你无法判断
但是,您可以扩展代码以在运行时强制执行:
|
|
|
2
0
正如@Jon已经指出的,使用属性不是正确的方法。
在我的例子中,到目前为止最令人满意的解决方案是声明另一个带有后缀的属性
此设置必须声明为
然后在配置包装器中:
|
|
|
3
0
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |