我正在通过用户界面动态创建节点列表。在我的列表中,我可以通过反射实例化这些对象,根据下面的类结构将任意数量的对象(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 代表我想用于向下转换的类。
我可以通过使用 switch 语句来解决这个问题每次添加节点时的语句。如果可能的话,这是我宁愿不做的事情。
提前感谢您的任何回复。
感谢 Douglas 指出我可以使用 FieldInfo 来获取 iA 的值。我只是想在这个话题上多扩展一点。如果我想采用 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
}