我有一個主實例存儲裏面帶有選項的各種子類實例。如何用反射修復空的子類實例
Class MainClass
{
public bool b;
public int i;
public List l = new List();
Class SubClass1
{
...
}
public SubClass1 sub1 = new SubClass1();
Class SubClass2
{
...
}
public SubClass2 sub2 = new SubClass2();
}
現在,當啓動所有類都正確instatiated,然後設置一些選項,並結果序列化。
問題出現時(出於各種原因)我必須更改實例的名稱。 例如SubClass2 ----> SubClassB 因此,反序列化SubClassB顯然是空的。
所以我必須解決這個缺點,並且我已經關於反射。像[僞] 東西
foreach(var subclass in MainClass)
{
if(subclass is null)
{
Type subClassType = typeof(subclass);
subclass = new subClassType();
}
}
預先感謝您的任何幫助。
---添加完整性從thehennny的提示解決方案---
private void CheckAndFixNullInstances()
{
easyRunData.OptionsReport = null;
Type fieldsType = typeof(EasyRunBinSerializableData);
FieldInfo[] fields = fieldsType.GetFields(BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < fields.Length; i++)
{
string str = fields[i].Name + " " + fields[i].GetValue(easyRunData);
if (fields[i].GetValue(easyRunData) == null)
{
string strFieldType = fields[i].FieldType.AssemblyQualifiedName;
Type t = Type.GetType(strFieldType);
object item;
item = Activator.CreateInstance(t);
fields[i].SetValue(easyRunData, item);
}
}
}
請嘗試更好地解釋什麼情況..你是否更改類型或實例的名稱?當你是否改變它?在MainClass的foreach中獲得什麼?無論如何,'新的subClassType()'是沒有意義的..也許你想'Activator.CreateInstance(typeof(subClass))' –
對不起,沒有足夠清楚。這種情況是,我用MainClass爲客戶提供了帶有子類實例的子程序:subclass1,subclass2。然後我序列化Mainclass值。之後(由於各種原因)我改變了子類subclass2 ---> subclassB的名字。現在反序列化子類B時顯然是空的,我必須採取行動。 – Patrick
啊......你打破向後兼容的一個經典問題,你意識到你可以改變類的名稱爲你想要的任何東西,只要你將它連續化爲與以前一樣的名字即可。例如如果您要序列化爲XML,則可以使用XML屬性來說明您的類轉換的元素名稱! https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute(v=vs.110).aspx – Ruskin