如何标记运行时所需的成员但不应在代码中使用?

Gre*_*som 2 .net c# properties visual-studio

有时,.NET运行时要求我们为属性创建公共setter,这些属性应该是真正的只读属性.例如:

  1. XmlSerializer要求序列化属性是可写的,即使我们只是单向序列化.
  2. 我在WPF中有一个不寻常的情况,我需要在MultiBinding中有一个TwoWay绑定,即使在概念上绑定值永远不会改变.这要求属性可写.

在每种情况下,我都可以将setter留空,而不会影响功能,但这可能会导致混乱.

鉴于我无法避免在这些属性上使用公共setter,是否有办法在访问setter时生成编译器警告?属性[Deprecated][Obsolete]将完成工作,但措辞/意图是不对的.

Jar*_*Par 5

我解决这个问题的方法是,为了序列化,我根本不会破坏我的类型的完整性.序列化的过程完全与数据有关,而与行为有关.我拒绝为仅限数据的方案破坏我的类型的行为.

相反,我设计我的类型以实现最有效+安全的使用.如果结果类型不可序列化并且我找到了需要它的场景,我将创建单独的类型,这些类型仅用于序列化其他类型.

这是一个快速的样本.

// My Core Immutable Type
namespace MyProject {
  public sealed class Student { 
    private readonly string _name;
    public string Name { 
      get { return _name; }
    }
    public Student(string name) {
      _name = name;
    }
  }
}

// My Xml Serialization Type
namespace MyProject.Serialization {
  public class SerializableStudent {
    public string Name;

    public SerializableStudent(Student source) {
      Name = source.Name;
    }

    public Student ConvertToStudent() {
      return new Student(Name);
    }

  }
}
Run Code Online (Sandbox Code Playgroud)