我有一个抽象类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);
}
}
在此课程中,a
和b
是输入,而行是输出。其他用户可以通过阅读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);
}
}
所以每当有人试图 我知道属性只能应用于类型而不是变量但我在脑海中有类似的东西,所以每个人都可以享受编写新节点 任何帮助将不胜感激。
答案 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))