ユーザーインターフェイスを介してその場でノードのリストを作成しています。私のリストでは、リフレクションを介してこれらのオブジェクトをインスタンス化することにより、以下のクラス構造に基づいて、任意の数のオブジェクト(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
}