在C#中使用属性/接口的区别

Fir*_*DoL 3 c# attributes interface

这不是一个问题,但更像是我最近的想法.我将XmlAttribute作为XmlSerialize类作为示例:您可以将属性设置为一个类来选择应该序列化哪些属性,但是通过实现一个teorical接口IXmlSerializable可以很容易地完成同样的事情(它确实存在类似的东西,我不记得了)并重载了一个方法"Serialize",该类只调用了你要序列化的属性上的Serialize(this.myProp1.Serialize()),同样用于反序列化

所以我基本上说的是:属性方法有点多余吗?(我实际上喜欢它,但我发现它与界面在逻辑上并不相同)

谢谢你的回答,正如我所说,这只是一个想法...希望有人会发现它很有趣

更新1:我以错误的方式解释自己,我问的是"为什么我应该选择属性而不是接口(或相反)",不完全是这个特定情况(我采取序列化因为是第一个流行的东西在我的脑海里),顺便感谢你的答案,因为他们非常有趣

Mar*_*ell 8

从意见和downvote,也许我应该强调我的主要点的位置:东西可以救我小时的工作(每类)和可怕的代码的复杂性是非常多余,而且非常,非常受欢迎.


"很容易"?好; 我在序列化方面很有经验,但实现并不是我所说的那么简单.事实恰恰相反.

如果您不想使用属性,则会有一个重载XmlSerializer,允许您在运行时配置它.

但每当我听到"执行IXmlSerializable" 时,我都会不寒而栗.属性方法非常快速简便:

[XmlRoot("foo"), XmlType("foo")]
[XmlInclude(typeof(SuperFoo))]
public class Foo {
    public string X {get;set;}

    [XmlAttribute("y")]
    public int? Y {get;set;}

    [XmlElement("item")]
    public List<string> Items {get;set;}
}
public class SuperFoo : Foo {}
Run Code Online (Sandbox Code Playgroud)

我挑战你在2小时内为这个非常简单的例子编写一个强大的实现...并记住你写的每一行都是你必须维护的一行.IXmlSerializable