1

ユーザーインターフェイスを介してその場でノードのリストを作成しています。私のリストでは、リフレクションを介してこれらのオブジェクトをインスタンス化することにより、以下のクラス構造に基づいて、任意の数のオブジェクト(AAA、BBBなど)をリストに追加できます。

public abstract class Node : IDisposable
{ 
    protected int x;
}
public class AAA : Node
{ 
    public int iA;
}
public class BBB : Node
{ 
    public int iB;
}

リストを作成した後、派生オブジェクトの拡張フィールドにアクセスしたいと思います。拡張フィールドにアクセスするにはダウンキャストする必要があることはわかっていますが、現在それを行うには、明示的なキャストを実行する必要があります。

foreach (Node nn in MyList)                   //assume the first node in the list is AAA
{
    int m = ((namespace.AAA) nn).iA;          //this works
    int n = (AAA) nn).iA;                     //this works
}

文字列を使用して実際のダウンキャストを作成できるかどうか疑問に思いました。多分それはできません。多分私は何かが欠けています。うまくいかないことをやりたいのですが、次のようになります。

foreach (Node nn in MyList)       //assume the first node in the list is AAA
{
    Type t2 = nn.GetType();       //{Name = AAA; FullName = namespace.AAA} (*debugger*)
    string str = t2.FullName;     //namespace.AAA

    int m = ((str) nn).iA;         //this DOESN'T work
}

デバッガーでnnの値を見ると、FullNameはダウンキャストに使用するクラスを表しています。

これは、castステートメントのクラスとハードコードを表す文字列に基づくswitchステートメントを使用することで回避できますが、100を超える異なるノードがあり、将来的にノードを追加するため、スイッチを変更する必要があります。ノードが追加されるたびにステートメント。これは、可能な限りやりたくないことです。

ご回答ありがとうございます。

たとえば、FieldInfoを使用してiAの値を取得できることを指摘してくれたDouglasに感謝します。このトピックについてもう少し詳しく説明したいと思います。クラスAAAを取得して構成を通じて拡張したい場合は、FieldInfoを介してそれらのクラスのフィールドにアクセスすることもできます。

public class AAA : Node
{ 
    public int iA;
    public X[] XArray;   //where X is some other random class with pubic fields
    public Y[] YArray;   //where Y is some other abstract class
 }
4

4 に答える 4

0

Node クラスで抽象プロパティを設定しようとせず、AAA と BBB で実装しようとしないのはなぜですか。

public abstract class Node : IDisposable
{ 
    protected int x;
    public abstract int i;
}
public class AAA : Node
{ 
    public override int i;
}
public class BBB : Node
{ 
    public override int i;
}

そして、次のように foreach を使用します。

foreach (Node nn in MyList)       
{
    int m = nn.i;         
}
于 2013-03-22T17:29:33.327 に答える
0

私にとって、これは C# の問題ではなく、オブジェクト設計の問題です。

一般的に処理したいノードがたくさんありますが (すばらしい)、独自の方法でそれらから特殊なデータを取得できるようにしたいと考えています。これは、(おそらく)無制限の量の一意のデータを持つというコンテキストではそれほど優れていません。

問題は、カプセル化された一意のデータと、そのデータへの自由な汎用アクセスという両方の長所を活用したいということです。

ノードの設計を取り、ノードの一般的な消費者がどのような操作/アクセスを利用できるようにするかを長く真剣に考え、それを抽象基本クラスまたは提供する少数の (っぽい) インターフェースで提供する必要があると思います。そのアクセス。

それ以外の場合は、コードのどこかで多くのダウンキャストを見たり、リフレクションを使用して物事を推測したり、必要な値を記述して取得するための標準インターフェイスを使用したりします。

于 2013-03-22T17:30:02.617 に答える