JNY*_*ger 6 c# generics types dynamic
我这里有一个奇怪的问题.我有一个项目的约束,其中一个属性的值必须要么是一个数字(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;}
}
Run Code Online (Sandbox Code Playgroud)
我考虑过使用泛型,有一个where T : struct约束,但是这仍然留下太多的理论上可以设置的类型,实际上是无效的类型.当然,我可以在构造/设置Value参数期间执行类型检查和抛出异常,但这不像"干净"代码.
我看了一下这个问题你如何使用一个可以是多种类型的变量?但它并没有真正帮助,因为它更多的是处理继承的问题.但是,使用多个可空的私有字段并根据填充的单个属性返回单个属性是可能的,但我觉得必须有更好的方法.
我想到的另一种可能性是使用dynamic类型并执行一些反射魔术来检查基础类型(并执行转换和格式化/抛出异常).我有点害怕这会伤害到性能.
这种情况有什么最佳做法吗?如果没有,有没有比我提到的更好的方法来解决这个问题?
编辑Eric Lippert 在他的一个史诗般的 stackoverflow 答案中教会了我这种类型的调度,我现在正在寻找它。如果/当我找到它时,我会用链接更新这个答案(这个人已经回答了很多问题)。另外,OP,你问到性能问题,看看同样来自 Lippert 的信息:动态变量如何影响性能?
我会混合使用动态和特殊情况处理,以及一个通用类型来捕获所有未定义(尚未实现)的类型。
class Foo
{
public dynamic Value { get; set; }
}
class FooHandler
{
public void Serialize(Foo foo)
{
SerializeField(foo.Value);
}
void SerializeField(int field)
{
Console.WriteLine("handle int");
}
void SerializeField<T>(T field)
{
throw new NotImplementedException("Serialization not implemented for type: " + typeof(T));
}
}
class Program
{
[STAThread]
static void Main(string[] args)
{
Foo f = new Foo();
f.Value = 1;
FooHandler handler = new FooHandler();
handler.Serialize(f);
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在闲暇时添加类型。