我有一个主实例存储里面带有选项的各种子类实例。如何用反射修复空的子类实例
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