使构造函数仅接受 C# 中具有 [Serializable] 属性的对象
Posted
技术标签:
【中文标题】使构造函数仅接受 C# 中具有 [Serializable] 属性的对象【英文标题】:Make constructor to only accept objects with [Serializable] attribute in C# 【发布时间】:2018-05-09 12:59:12 【问题描述】:我希望我的构造函数只接受具有[Serializable]
属性的对象。
public MyClass(object obj)
类似于:
public MyClass(? obj)
如何在 C# 中做到这一点
【问题讨论】:
你确定吗? [Serializable] 的东西已经很老了,我们现在有更好的方法。 简短的回答:你不能做这个编译时间。使用反射并在运行时抛出异常。 @HenkHolterman 你能说得更具体点吗? @HenkHolterman 关于其他方法? 谷歌“C#序列化”并挑选结果。 JSon 最近很流行。 【参考方案1】:我首先想到的是通过只允许实现ISerializable
接口的对象来简化这一点:
public MyClass(ISerializable obj)
// ...
但我觉得这太简单了,不是吗?
或者:
public MyClass(Object obj)
if (!Attribute.IsDefined(obj.GetType(), typeof(SerializableAttribute)))
throw new ArgumentException("The object must have the Serializable attribute.","obj");
// ...
我认为您甚至可以使用以下方法进行检查:
obj.GetType().IsSerializable;
【讨论】:
obj.GetType()
是反射。
Err 我的意思是,不使用 Attribute.IsDefined <_>
但我的目标是在编译时限制它。
好吧,你不能。绝对没有办法做到这一点。您可以在上面找到两个不错的选择。以上是关于使构造函数仅接受 C# 中具有 [Serializable] 属性的对象的主要内容,如果未能解决你的问题,请参考以下文章
c#中泛型类构造函数重载赋值时为啥不接受null?对其赋空值应给怎么做?
C#:将 BusinessObject 传递给“BusinessLayer”构造函数或其方法?
从 2.8.4 更新到 27.1.1 后,C# CsvWriter 抛出“CsvWriter 不包含接受 1 个参数的构造函数”