如何向对象的字段添加额外的元数据?
How to add an extra metdata to a field of an object?
我有一个抽象的class节点,每个人都应该在我们的办公室实现:
public abstract class Node
{
public abstract void run();
}
实施的 classes 还应包含至少一个输入和一个输出属性。请看下面的例子:
public class LineNode : Node
{
public Point a;
public Point b;
public Line line;
public override void run()
{
line = new Line(a, b);
}
}
在这个class中,a
和b
是输入,line是输出。其他用户可以通过阅读 run()
方法的主体来找到输出的是哪一个(这很荒谬,不是吗?)。但主要问题是在我的应用程序中的某个地方我需要知道一个字段是输入还是输出。所以我可以以图形方式显示输入和输出变量。或者如果有人试图在节点外分配输出或什至 return 编译时错误,则抛出异常。 (我不想使用私有关键字,我需要所有字段都是 public)。
起初我尝试将字段包装在类型化的 Input<T>
和 Output<T>
classes 中,这样就可以使用反射列出节点的所有输出字段。但是每个人都抱怨它变得如此复杂。因为我们必须在两行中创建一个简单的 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);
}
}
所以每当有人试图
我知道属性只能应用于类型而不是变量,但我脑子里有这样的东西所以每个人都可以享受编写新节点的乐趣
任何帮助将不胜感激。
当然,您可以像在代码的最后一块中写的那样使用属性。为此,您需要声明以下 类:
[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))
我有一个抽象的class节点,每个人都应该在我们的办公室实现:
public abstract class Node
{
public abstract void run();
}
实施的 classes 还应包含至少一个输入和一个输出属性。请看下面的例子:
public class LineNode : Node
{
public Point a;
public Point b;
public Line line;
public override void run()
{
line = new Line(a, b);
}
}
在这个class中,a
和b
是输入,line是输出。其他用户可以通过阅读 run()
方法的主体来找到输出的是哪一个(这很荒谬,不是吗?)。但主要问题是在我的应用程序中的某个地方我需要知道一个字段是输入还是输出。所以我可以以图形方式显示输入和输出变量。或者如果有人试图在节点外分配输出或什至 return 编译时错误,则抛出异常。 (我不想使用私有关键字,我需要所有字段都是 public)。
起初我尝试将字段包装在类型化的 Input<T>
和 Output<T>
classes 中,这样就可以使用反射列出节点的所有输出字段。但是每个人都抱怨它变得如此复杂。因为我们必须在两行中创建一个简单的 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);
}
}
所以每当有人试图 我知道属性只能应用于类型而不是变量,但我脑子里有这样的东西所以每个人都可以享受编写新节点的乐趣 任何帮助将不胜感激。
当然,您可以像在代码的最后一块中写的那样使用属性。为此,您需要声明以下 类:
[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))