Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以其他派生类作为属性反序列化派生类_C#_Xml_Inheritance_Deserialization_Abstract - Fatal编程技术网

C# 如何以其他派生类作为属性反序列化派生类

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

我有两个项目。一个是WPF应用程序,第二个是我的“工具箱”,它具有预定义的WPF控件、XML反序列化和一些基本配置类

在我的工具包中,我有一个
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
(在我的例子中,使用Linq
First()
方法就足够了)-这应该与
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
(在我的例子中,使用Linq
First()
方法就足够了)-这应该与
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”只要引用的类都是可序列化的,您就应该能够反序列化。