【发布时间】:2020-01-13 00:39:40
【问题描述】:
我正在我的应用中实现“保存/加载”功能。有各种类型的Vertex 对象有很多静态字段,但是apparently 你不能序列化静态字段。我正在创建一个其实例包含这些字段的类,并且为了避免填充这些字段的代码过多,我将它们作为属性来实现。
但是,这样做的语法似乎过于庞大,所以我正在寻找一种方法来简化它:
public Color CircleFillColor { get => CircleVertex.fillColor; set => CircleVertex.fillColor = value; }
public Color SquareFillColor { get => SquareVertex.fillColor; set => SquareVertex.fillColor = value; }
public Color TriangleFillColor { get => TriangleVertex.fillColor; set => TriangleVertex.fillColor = value; }
如果我们在 C# 中有 macros,我可以这样写:
#define passthru(F) { get => F; set => F = value; }
public Color CircleFillColor passthru(CircleVertex.fillColor)
public Color SquareFillColor passthru(SquareVertex.fillColor)
public Color TriangleFillColor passthru(TriangleVertex.fillColor)
有这样的属性的简写吗?
【问题讨论】:
-
什么是
Vertex对象?为什么不能将它们更改为实例成员并像往常一样序列化Vertex实例? -
T4 模板可以做你想做的事。
partial class将包含使用静态字段反射生成的属性。 -
您可以改为通过反射进行序列化,这个答案有一个示例说明您可能希望如何做到这一点stackoverflow.com/a/5261678/10431
-
@Sinatr A
Vertex有一个 X/Y 坐标、一个PictureBox、一个在PictureBox上绘制其形状的方法以及一些用于拖放的逻辑。每个CircleVertex必须有一个FillColor,每个SquareVertex和每个TriangleVertex也应该有一个,所以static字段似乎是一个自然的选择。根据我的喜好,数据和演示文稿有点太接近了,但这正是规范所要求的。 -
取决于您的喜好。您将如何对静态类的更改做出反应,任何生成的代码或手动编写的代码都是静态的 - 不会自动更新。反射本身就是一些编程,如果您想要这种自动性,或者您有超过 20 或 50 个属性,则值得努力。写 20 行愚蠢的行,你犯的错误比写 20 行聪明的行要少——但它们看起来并不优雅。你想让你的代码看起来不错吗?真的是偏好问题。
标签: c# syntax properties