我目前正在为我的一些课程编写序列化程序。 我使用以下签名创建了一组静态方法
public static string serialize(int val);
public static string serialize(string val);
public static string serialize(float val);
public static string serialize(MyOwnClass val);
public static string serialize(AnotherClass val);
public static string serialize(SomethingElse val);
此外,有时我必须处理null
值。
我想以一种特殊的方式对待它们,即签名如:
public static string serialize(null val);
对函数的调用应该是这样的:
string s = serialize(someVariableThatMightBeNull);
它应该在serialize
被调用时使用值null
触发,而与声明变量的类型无关。
有没有办法在C#中实现这个?
目前我唯一的解决方案是将此行添加到每个方法: (对于可以为null的数据类型):
if(val == null){ dealWithNull(); }
这个解决方案看起来有点单调乏味,因为我有大约30种不同的情况,我宁愿没有调度方法。
例如,Xtend功能dispatch methods
也提供Void
类型,用于检查空值。
Xtend Dispatch Methods
答案 0 :(得分:3)
如果我理解正确的话:
我使用等待object
的方法签名。
编译器将始终选择看起来与您使用的最接近的方法签名。因此,如果没有其他可用的方法,它将仅使用带有object
签名的方法。
在此方法中,您将能够检查参数是否为null和/或处理没有自己的静态方法进行序列化的类
对于自定义序列化,恕我直言,我认为最好让每个类自己处理。
为了做到这一点,我要定义一个包含方法ICustomSerialization
的接口string CustomSerialization()
然后我需要创建每个类,我需要从这个接口序列化继承并在每个类中实现该方法。
这样可以将序列化代码放在相关类中,避免使用大量序列化类。
允许序列化程序使用接口(因此不必知道如何处理每个特定的类)
答案 1 :(得分:2)
将被调用的方法取决于传入的东西的类型。
如果您输入的内容为string
且保留空值,那么它将使用字符串参数命中该方法。如果你有一个MyOwnClass
类型的变量并且它是null,那么它将使用MyOwnClass
参数点击该方法。
我认为您最好的选择是在代码外部执行此操作。
if(whatever == null) { serializeNull(whatever); } else { serialize(whatever); }
答案 2 :(得分:0)
您当前的解决方案是C#中唯一的解决方案(where you don't have true templates)。
我认为只要样板代码的大小与序列化代码的其余部分相比保持较小,我可能会对此感到高兴。
如果您可以在类和序列化代码之间引入紧耦合,那么您可以采用“OO”方式通过引入处理空值的基类来消除冗余,并使每个派生类覆盖虚拟实施方法。
答案 3 :(得分:0)
所以我有一个类似的问题,除了您的解决方法不适合我,因为我需要对null
重载使用不同的返回类型。例如。我需要Tensor
== Tensor
返回Tensor<bool>
,而Tensor
== null
仅返回bool
。
我解决该问题的方法是以下技巧,它在以下假设下有效:
Tensor
是最具体的类别,通常不应该使用
被继承。==
以外,引用类型的第二个操作数没有Tensor
的重载。如果是这种情况,那么您可以简单地定义class NullTensor: Tensor
,它不能被实例化(仅限私有构造函数),并且具有重载
Tensor
== NullTensor
-> bool
Tensor
== Tensor
-> Tensor
然后,如果您编写(Tensor)x == null
,则第一个重载将被替换为第二个重载,因为null
可以是Tensor
或NullTensor
,但是第二个类型是更具体。