Nul*_*tc. 3 c# attributes design-time
我正在尝试将信息添加到C#接口,我正在尝试使用属性添加此信息.
比如说,我到处都有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 { }
}
Run Code Online (Sandbox Code Playgroud)
这样,当另一个程序员使用我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试它时,属性根本不出现.
我知道你可以用/// - 评论来做这件事.
我知道你可以在任何东西上使用System.ComponentModel.DescriptionAttribute类(虽然会出现方法的描述,但不会出现关于参数的描述).
我是否在使用C#属性做一些完全奇怪的事情?不当?疯?
我是否在使用C#属性做一些完全奇怪的事情?
是.
您正尝试使用属性来表达有关参数的业务域事实.这不是属性的含义.属性用于表达有关编程语言机制的事实.也就是说,当你说:
[Obsolete]
class BlackAndWhiteTelevision {}
Run Code Online (Sandbox Code Playgroud)
这就是说类本身已经过时,你不应该再使用它了,因为类已被替换为不同的类.不要使用过时的属性来声明该类所代表的物理世界事物不再能够以盈利的方式制造和销售.
特定参数表示行标识符是关于方法业务的事实,而不是关于方法的机制.您应该在方法参数上放置属性,例如"此参数具有默认值"或"此参数应通过COM互操作调用时按值编组"或"此参数将在读取之前写入" - 这些是关于参数作为编程语言中的变量的事实,而不是关于参数如何在业务流程中模拟某些概念的事实.
有关如何使用属性来表达有关机制而非业务域的事实的更多想法,请参阅我关于该主题的文章及其评论:
http://blogs.msdn.com/b/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx