使构造函数仅接受 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 ++:仅接受字符串文字的构造函数

如何更改 C# Record 构造函数的行为

如何更改 C# Record 构造函数的行为

c#中泛型类构造函数重载赋值时为啥不接受null?对其赋空值应给怎么做?

C#:将 BusinessObject 传递给“BusinessLayer”构造函数或其方法?

从 2.8.4 更新到 27.1.1 后,C# CsvWriter 抛出“CsvWriter 不包含接受 1 个参数的构造函数”