如何将额外的元数据添加到对象的字段?

时间:2015-06-08 13:29:06

标签: c# attributes metadata

我有一个抽象类Node,每个人都应该在我们的办公室实现:

public abstract class Node
{
    public abstract void run();
}

实现的类还应包含至少一个输入和一个输出属性。请看以下示例:

public class LineNode : Node
{
    public Point a;
    public Point b;
    public Line line;
    public override void run()
    {
        line = new Line(a, b);
    }
} 

在此课程中,ab是输入,而行是输出。其他用户可以通过阅读run()方法的主体来找到输出哪一个(这是荒谬的不是吗?)。但主要的问题是,在我的应用程序的某个地方,我需要知道字段是输入还是输出。所以我可以用图形方式显示输入和输出变量。如果有人试图在节点外部分配输出甚至在编译时返回错误,则抛出异常。 (我不想使用私有关键字我需要所有字段都是公开的)。
起初我尝试在类型为Input<T>Output<T>的类中包装字段,因此可以使用反射列出节点的所有输出字段。但是每个人都抱怨它变得那么复杂。因为我们必须在两行中创建一个简单的int属性:

Output<int> out = new Output<int>();
out.value = 10;

是否可以在c#中编写类似的内容?

public class LineNode : Node
{
    [Input]
    public Point a;
    [Input]
    public Point b;
    [Output]
    public Line output_line;
    public override void run()
    {
        output_line = new Line(a, b);
    }
}

所以每当有人试图 我知道属性只能应用于类型而不是变量但我在脑海中有类似的东西,所以每个人都可以享受编写新节点 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

当然,您可以使用属性,就像您在代码的最后一个块中所写的一样。为此,您需要声明以下类:

[AttributeUsage(AttributeTargets.Field)]
public class Input:Attribute
{
}
[AttributeUsage(AttributeTargets.Field)]
public class Output:Attribute
{
}

然后,您可以使用反射检索字段的属性:

var isInput = Attribute.IsDefined(typeof(LineNode).GetField(fieldName), typeof(Input))

var isOutput = Attribute.IsDefined(typeof(LineNode).GetField(fieldName), typeof(Output))