C# 如何以其他派生类作为属性反序列化派生类
我有两个项目。一个是WPF应用程序,第二个是我的“工具箱”,它具有预定义的WPF控件、XML反序列化和一些基本配置类 在我的工具包中,我有一个C# 如何以其他派生类作为属性反序列化派生类,c#,xml,inheritance,deserialization,abstract,C#,Xml,Inheritance,Deserialization,Abstract,我有两个项目。一个是WPF应用程序,第二个是我的“工具箱”,它具有预定义的WPF控件、XML反序列化和一些基本配置类 在我的工具包中,我有一个ConfigurationBase类: public class ConfigurationBase : XmlDeserializeConfigSectionHandler { public GuiConfigurationBase GuiConfiguration { get; set; } } 这是GuiConfigurationBas
ConfigurationBase
类:
public class ConfigurationBase : XmlDeserializeConfigSectionHandler
{
public GuiConfigurationBase GuiConfiguration { get; set; }
}
这是GuiConfigurationBase
public class GuiConfigurationBase
{
public int LogLineCount { get; set; }
}
My toolkit包含应用程序内日志消息的预定义视图。因此,我的LogViewModel
构造函数需要一个ConfigurationBase
,它应该包含GuiConfiguration
和LogLineCount
属性
这是因为我不想为每个应用程序实现应用程序内日志
然后我有一个WPF项目。它包含一个从ConfigurationBase
派生的类Config
。它的扩展与其他一些不重要的道具
我还需要扩展GuiConfigurationBase
,因此我有一个名为GuiConfiguration
的类,它派生自GuiConfigurationBase
public class Config : ConfigurationBase
{
public string AppName { get; set; }
}
public class GuiConfiguration : GuiConfigurationBase
{
public int TextSize { get; set; }
}
我还使用XmlSerializer对XML文件进行去序列化。我需要填充两个派生类
请问我怎样才能做到这一点
我尝试了一些基类抽象,但没有成功
谢谢你的建议。我找到了解决办法。
有必要使用XmlAttributeOverrides
因为我有两个项目,所以我必须使用反射来检索从GuiConfigurationBase
派生的类。(我对项目一无所知,我的工具包项目在哪里被引用)
然后为每个类添加新的xmlementattribute
(在我的例子中,使用LinqFirst()
方法就足够了)-这应该与xmlcludeAttribute
相同(Type)
最后为ConfigurationBase
类的属性GuiConfiguration
以下是我的反序列化方法:
public T Deserialize<T>(string input) where T : class
{
//Init attrbibutee overrides
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
//Load all types which derive from GuiConfiguration base
var guiConfTypes = (from lAssembly in AppDomain.CurrentDomain.GetAssemblies()
from lType in lAssembly.GetTypes()
where typeof(GuiConfigurationBase).IsAssignableFrom(lType) && lType != typeof(GuiConfigurationBase)
select lType).ToArray();
//All classes which derive from GuiConfigurationBase
foreach (var guiConf in guiConfTypes)
{
XmlElementAttribute attr = new XmlElementAttribute
{
ElementName = guiConf.Name,
Type = guiConf
};
attrs.XmlElements.Add(attr);
}
//Add Attribute overrides for ConfigurationBase class's property GuiConfiguration
attrOverrides.Add(typeof(ConfigurationBase), nameof(ConfigurationBase.GuiConfiguration), attrs);
XmlSerializer ser = new XmlSerializer(typeof(T), attrOverrides);
using (StringReader sr = new StringReader(input))
{
return (T)ser.Deserialize(sr);
}
}
public T反序列化(字符串输入),其中T:class
{
//Init attrbibutee重写
XmlAttributeOverrides attrOverrides=新的XmlAttributeOverrides();
XmlAttributes attrs=新的XmlAttributes();
//加载从GUI配置库派生的所有类型
var guiConfTypes=(来自AppDomain.CurrentDomain.GetAssemblys()中的lAssembly)
从lAssembly.GetTypes()中的lType
其中typeof(GuiConfigurationBase).IsAssignableFrom(lType)&&lType!=typeof(GuiConfigurationBase)
选择lType).ToArray();
//从GuiConfigurationBase派生的所有类
foreach(guiConfTypes中的var guiConf)
{
XmlElementAttribute attr=新的XmlElementAttribute
{
ElementName=guiConf.Name,
Type=guiConf
};
attrs.xmlements.Add(attr);
}
//为ConfigurationBase类的属性GUI配置添加属性重写
Add(typeof(ConfigurationBase)、nameof(ConfigurationBase.GuiConfiguration)、attrs);
XmlSerializer ser=新的XmlSerializer(typeof(T),attrOverrides);
使用(StringReader sr=新StringReader(输入))
{
返回(T)序列反序列化(sr);
}
}
我希望它能帮助其他人:-)我找到了一个解决方案。
有必要使用XmlAttributeOverrides
因为我有两个项目,所以我必须使用反射来检索从GuiConfigurationBase
派生的类。(我对项目一无所知,我的工具包项目在哪里被引用)
然后为每个类添加新的xmlementattribute
(在我的例子中,使用LinqFirst()
方法就足够了)-这应该与xmlcludeAttribute
相同(Type)
最后为ConfigurationBase
类的属性GuiConfiguration
以下是我的反序列化方法:
public T Deserialize<T>(string input) where T : class
{
//Init attrbibutee overrides
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
//Load all types which derive from GuiConfiguration base
var guiConfTypes = (from lAssembly in AppDomain.CurrentDomain.GetAssemblies()
from lType in lAssembly.GetTypes()
where typeof(GuiConfigurationBase).IsAssignableFrom(lType) && lType != typeof(GuiConfigurationBase)
select lType).ToArray();
//All classes which derive from GuiConfigurationBase
foreach (var guiConf in guiConfTypes)
{
XmlElementAttribute attr = new XmlElementAttribute
{
ElementName = guiConf.Name,
Type = guiConf
};
attrs.XmlElements.Add(attr);
}
//Add Attribute overrides for ConfigurationBase class's property GuiConfiguration
attrOverrides.Add(typeof(ConfigurationBase), nameof(ConfigurationBase.GuiConfiguration), attrs);
XmlSerializer ser = new XmlSerializer(typeof(T), attrOverrides);
using (StringReader sr = new StringReader(input))
{
return (T)ser.Deserialize(sr);
}
}
public T反序列化(字符串输入),其中T:class
{
//Init attrbibutee重写
XmlAttributeOverrides attrOverrides=新的XmlAttributeOverrides();
XmlAttributes attrs=新的XmlAttributes();
//加载从GUI配置库派生的所有类型
var guiConfTypes=(来自AppDomain.CurrentDomain.GetAssemblys()中的lAssembly)
从lAssembly.GetTypes()中的lType
其中typeof(GuiConfigurationBase).IsAssignableFrom(lType)&&lType!=typeof(GuiConfigurationBase)
选择lType).ToArray();
//从GuiConfigurationBase派生的所有类
foreach(guiConfTypes中的var guiConf)
{
XmlElementAttribute attr=新的XmlElementAttribute
{
ElementName=guiConf.Name,
Type=guiConf
};
attrs.xmlements.Add(attr);
}
//为ConfigurationBase类的属性GUI配置添加属性重写
Add(typeof(ConfigurationBase)、nameof(ConfigurationBase.GuiConfiguration)、attrs);
XmlSerializer ser=新的XmlSerializer(typeof(T),attrOverrides);
使用(StringReader sr=新StringReader(输入))
{
返回(T)序列反序列化(sr);
}
}
我希望它能帮助其他人:-)拼写错误提示:拼写为派生/派生-而不是“to-derrive/derrive”-一个“r”就足够了,只要引用的类都是可序列化的,你就应该能够反序列化。拼写错误提示:拼写为派生/派生-而不是“to-derrive/derrive”-一个“r”只要引用的类都是可序列化的,您就应该能够反序列化。