【发布时间】:2014-04-20 11:10:40
【问题描述】:
我在这里遇到了一个奇怪的问题。我有一个项目约束,其中属性的值需要是数字(int、double、long 等都可以接受)、string 或datetime。 Value 参数需要是这三个之一的原因(错误..如果你计算所有可能的数值类型允许它多一点)类型是因为根据类型,基础值需要转换为用于序列化为 REST API 的特殊格式。为了简化这里的事情,将类作为 POCO 的基本思想:
class Foo
{
public string Name {get;set;}
public Guid Id {get; set;}
public UNKNOWN Value {get;set;}
}
我考虑过为此使用泛型,并带有where T : struct 约束,但这仍然留下了太多理论上可以设置但实际上是无效类型的类型。当然,我可以在 Value 参数的构造/设置期间执行类型检查并抛出异常,但这感觉不像是“干净”的代码。
我查看了这个问题 How do you work with a variable that can be of multiple types? ,但它并没有真正帮助,因为它更多的是处理继承的问题。但是,使用多个可为空的私有字段并根据填充的属性返回单个属性是可能的,但我再次觉得必须有更好的方法。
我想到的另一种可能性是使用dynamic 类型并执行一些反射魔法来检查底层类型(并执行转换和格式化/抛出异常)。我有点害怕这会真的影响性能。
对于这种情况有什么最佳做法吗?如果没有,根据我提到的内容,有没有更好的方法来处理这个问题?
【问题讨论】:
-
不要害怕
dynamic。最后,您不会因为使用它而失眠。如果您使用dynamic Value与object Value创建测试,请使用秒表来对比从动态属性与对象的检索,并且必须强制转换为预期的类型。无论哪种方式,您都会冒着假设错误类型的风险。 -
@IAbstract 我肯定会尝试一下,但我更关心的是从反射方法中获取底层类型的性能损失,因此我可以执行必要的格式化它正在被序列化。
-
我不会在这个任务中使用
dynamic;如果您希望“进行价值反射”,只需使用Object(因为dynamic适合“方法调用的神奇后期绑定”) - 但是,如果可能的话,我建议您考虑沿 接口。有关类型转换,请参阅Type Converters,以及在 Json.NET 等各种库中完成的各种特殊情况。 -
@user2864740:同意;但是,不能保证某个接口可以解决此特定问题。 :)
-
@JNYRanger 我的建议是尽可能沿接口对齐。使用
dynamic表示Duck Typing - 使用Object接受“任意类型”。