【发布时间】:2009-06-30 03:43:33
【问题描述】:
我遇到了这样一种情况:使用 System.Attribute 类(乍一看)似乎是个好主意。
我有一个要在我的应用程序中打印的对象,我需要在每个属性之前添加一个标签(或者只是在它之前添加一个字符串)。我可以将每个属性硬编码为:
Console.WriteLine("Color:"+obj.color);
Console.WriteLine("Size:"+obj.size);
每个属性以此类推。但不是它,我试图创建一个不需要硬编码这个“标签”的代码,这样我就可以动态地打印每个属性。
我得到了类似的东西,使用 System.Attribute 类:
public class MyObject
{
[MyCustomLabel("Color:")]
public string Color;
[MyCustomLabel("Size:")]
public string Size;
//etc...
}
所以我的问题来了:检索这个属性的值不是不可能的,但它并不友好,因为我不得不使用一些反射。
我并不真的害怕使用反射,但似乎我在使用属性来实现它不是为它创建的东西。
我想知道使用属性的最佳位置在哪里,如果这真的是使用它的情况。
【问题讨论】:
-
当有人要求您提供法语版本的应用程序时,您会怎么做?将面向用户的“魔术字符串”放入资源中,以便您可以轻松地将它们拉出并本地化,而不是放入将它们“嵌入”到元数据中的属性中。
-
关于属性与属性的更多想法:blogs.msdn.com/ericlippert/archive/2009/02/02/…
-
你为什么不喜欢反思?
-
我不明白 Eric Lippert 的评论。属性也可以使用可本地化的资源:例如继承自 System.ComponentModel.DescriptionAttribute 的内部 System.Windows.Forms.SRDescriptionAttribute 从资源中获取字符串。
-
“但是为什么要经历所有这些繁琐的事情?它能给你带来什么?” - 询问实现它的 .NET 团队。在他们的情况下,我怀疑这主要是因为 VS 属性窗口中的智能感知可以显示本地化描述。
标签: c# reflection code-reuse