我正在尝试将信息添加到 C# 接口(interface),并且我正在尝试使用属性添加此信息。
比如说,我到处都有int参数,这些int参数有的是“行ID”,有的是“列ID”。我希望能够做到这一点:
namespace RowIdTest1
{
using System;
public class Class1
{
public int Get([RowId] int r, [ColumnId] int c) { return 3; }
public void Set([RowId] int r, [ColumnId] int c, int x) { return; }
}
[AttributeUsageAttribute(AttributeTargets.All)]
public class RowIdAttribute : System.Attribute { }
[AttributeUsageAttribute(AttributeTargets.All)]
public class ColumnIdAttribute : System.Attribute { }
}
这样当另一个程序员使用我的 DLL 并浏览到 Visual Studio 中的 Class1 时, 他或她会在“Class1(来自元数据)”窗口中看到:
namespace RowIdTest1
{
public class Class1
{
public Class1();
public int Get([RowId] int r, [ColumnID] int c);
public void Set([RowId] int r, [ColumnID] int c, int x);
}
}
当我尝试时,属性根本没有出现。
我知道你可以用///-comments 做这种事情。
我知道你可以在任何东西上使用 System.ComponentModel.DescriptionAttribute 类(虽然方法的描述会出现但参数的描述不会出现)。
我是不是在用 C# 属性做一些非常奇怪的事情?不当?疯了吗?
最佳答案
Am I doing something totally weird with C# attributes?
是的。
您正在尝试使用属性来表达关于参数的业务领域事实。这不是属性的用途。属性用于表达有关编程语言机制的事实。也就是说,当你说:
[Obsolete]
class BlackAndWhiteTelevision {}
这就是说 类本身 已经过时并且您不应该再使用它,因为类 已被替换为不同的类。不要使用过时的属性来声明类所代表的物理世界事物不能再制造和销售以盈利。
一个特定的参数表示一个行标识符是关于您的方法的业务的事实,而不是关于该方法的机制的事实。您应该将属性放在方法参数上,以表达诸如“此参数具有默认值”或“此参数在通过 COM 互操作调用时应按值编码”或“此参数将在读取之前写入”之类的内容-- 这些是关于参数作为编程语言中的变量的事实,而不是关于参数如何为您的业务流程中的某些概念建模的事实。
有关如何使用属性来表达有关机制而不是业务领域的事实的更多想法,请参阅我关于该主题的文章及其评论:
http://blogs.msdn.com/b/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx
关于c# - 如何使用属性向 C# 类添加可见信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088540/