私は、誰もが私たちのオフィスに実装する必要がある抽象クラスノードを持っています:
public abstract class Node
{
public abstract void run();
}
実装されたクラスには、少なくとも1つの入力プロパティと1つの出力プロパティも含まれている必要があります。次の例を見てください。
public class LineNode : Node
{
public Point a;
public Point b;
public Line line;
public override void run()
{
line = new Line(a, b);
}
}
このクラスa
でb
は、andは入力であり、lineは出力です。他のユーザーは、run()
メソッドの本体を読むことで、どれが出力されているかを見つけることができます(ばかげていますね)。しかし、主な問題は、アプリケーションのどこかで、フィールドが入力であるか出力であるかを知る必要があることです。したがって、入力変数と出力変数をグラフィカルに表示できます。または、誰かがノードの外部に出力を割り当てようとした場合、またはコンパイル時にエラーを返した場合でも、例外をスローします。(プライベートキーワードを使用したくないので、すべてのフィールドをパブリックにする必要があります)。
最初は、フィールドを型付きでラップしようInput<T>
としましたOutput<T>
クラスなので、リフレクションを使用してノードのすべての出力フィールドを一覧表示することができました。しかし、そのように複雑になると誰もが不満を漏らしました。2行で単純な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))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加