如何使用属性将可见信息添加到C#类中

本文关键字:添加 类中 信息 何使用 属性 | 更新日期: 2023-09-27 18:22:07

我正在尝试向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 { }
}

这样,当另一个程序员使用我的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);
    }
}

当我尝试它时,属性根本不会出现。

我知道你可以用///-评论来做这种事情。

我知道你可以在任何事情上使用System.ComponentModel.DescriptionAttribute类(尽管会显示方法的描述,但不会显示参数的描述)。

我是不是在用C#属性做一些完全奇怪的事情?不恰当的精神失常的

如何使用属性将可见信息添加到C#类中

我是不是在用C#属性做一些完全奇怪的事情?

是的。

您正试图使用属性来表达关于参数的业务域事实。这不是属性的作用。属性用于表示编程语言机制的事实。也就是说,当你说:

[Obsolete]
class BlackAndWhiteTelevision {}

也就是说类本身已经过时,您不应该再使用它,因为该类已被另一个类替换。不要使用过时的属性来声明类所代表的物理世界事物不能再以盈利为目的制造和销售。

特定参数表示行标识符是关于方法的业务的事实,而不是关于方法的机制。您应该在方法参数上放置属性,这些属性表示"此参数具有默认值"、"通过COM互操作调用时,此参数应按值进行编组"或"在读取之前将写入此参数"等内容——这些都是关于参数在编程语言中作为变量的事实,而不是参数如何在业务流程中建模的事实

有关如何使用属性来表达有关机制而不是业务域的事实的更多想法,请参阅我关于这个主题的文章及其评论:

http://blogs.msdn.com/b/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx

我是不是在用C#属性做一些完全奇怪的事情?不恰当的精神失常的

通常,使用属性的原因是,您希望在运行时通过反射使程序可以获得有关类或其成员的某些信息。这与这个想法不一致,所以我认为这是对属性的不恰当使用。

我认为,给程序员一个微妙提示,让参数表示rowId的更可取的方法是使用参数名称:

public int Get(int rowId, int columnId)

再加上///评论,就像你提到的那样,你就有了一个非常有效的方法来告诉你班上的消费者你的期望是什么。

最后,如果你真的想防止用户意外地以错误的顺序提供参数,你可以利用强类型。

public struct RowId {
    private int _rowId;
    public int Value{get{return _rowId;}}
    public RowId(int rowId) {_rowId = rowId;}
}

public int Get(RowId rowId, ColumnId columnId)

这将使人们几乎不可能意外地混淆输入。(请注意,我不推荐这种模式:它引入了大量开销,但收效甚微。)

不,你不能。为什么不把这些论点命名为呢

public int Get(int rowId, int columnId)

我不得不说我不太理解这一点。你的库的用户(我想)必须反编译你的类来查看元数据,这很常见吗?为什么不为接口编写一些XML文档,并将其随库一起提供呢?

我不知道这是否"疯狂"。如果它不能正常工作,也许可以将属性分配给某种数据结构中的嵌套项,然后将数据结构作为参数传递给函数。只有一个想法。