Я создаю список узлов на лету через пользовательский интерфейс. В моем списке я могу добавить любое количество объектов (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
}
Мне было интересно, могу ли я использовать строку для создания фактического downcast. Может быть, это невозможно. Может быть, я что-то упустил. То, что я хотел бы сделать, что НЕ работает, было бы примерно следующим.
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
}
Когда я смотрю на значение пп в отладчике ПолноеИмя представляет класс я хочу использовать для смиренных.
Я мог бы обойти это, используя оператор switch на основе строки, представляющей класс и жесткий код в операторе cast, но поскольку у меня есть более 100 различных узлов, и я буду добавлять больше узлов в будущем, я бы изменять инструкцию switch каждый раз, когда узел добавляется. Это то, что я бы предпочел не делать, если все возможно.
Заранее благодарим за любой ответ.
Благодаря Дугласу, указав, что я могу использовать 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
}
http://stackoverflow.com/questions/493490/converting-a-string-to-a-class-name – box86rowh
Это похоже на идеальное использование для дженериков, но для того, чтобы сказать, что больше потребуется увидеть немного больше ваших использование приложения. –
Вам не понадобится инструкция switch, чтобы узнать, ищете ли вы свойство iA типа AAA или iB по типу BBB? –