我通過用戶界面即時創建節點列表。在我的列表中,我可以通過反射來實例化這些對象,從而根據下面的類結構向List中添加任意數量的對象(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
}
當我在調試器中查看nn的值時,FullName表示我想用於downcast的類。
我可以通過使用switch語句來解決這個問題,該語句基於代表cast類語句中的類和硬代碼的字符串,但由於我有超過100個不同的節點,我將在未來添加更多的節點,每次添加節點時都要修改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
}
http://stackoverflow.com/questions/493490/converting-a-string-to-a-class-name – box86rowh 2013-03-22 17:17:09
這看起來像泛型的完美使用,但要說更多將需要看到更多的你的應用程序使用 – 2013-03-22 17:22:23
您是否仍然需要switch語句來知道您是否正在尋找類型爲BBB的AAA或iB型屬性iA? – 2013-03-22 17:27:32