如何写类接受任何...对象?

Dia*_*ock 2 .net c#

我有一个实例化的类来保存或加载xml数据.

例如:

    serilizer = new ObjectSerializer();

    npcEntityData = serilizer.LoadNPCData(fileName);
Run Code Online (Sandbox Code Playgroud)

去:

namespace TDIYCSharpLib
{
    public class ObjectSerializer
    {

        NPCBaseInfo NPC;
        MonsterBaseInfo monster;

        public void SaveNPCData(object objGraph, string fileName)
        {
            XmlSerializer xmlFormat = new XmlSerializer(typeof(NPCBaseInfo));

            using(Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                xmlFormat.Serialize(fileStream, objGraph);
            }
        }

        public NPCBaseInfo LoadNPCData(string fileName)
        {
            XmlSerializer xmlDeformat = new XmlSerializer(typeof(NPCBaseInfo));

            using (StreamReader fileStream = new StreamReader(fileName))
            {
                NPC = (NPCBaseInfo)xmlDeformat.Deserialize(fileStream);
            }

            return NPC;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是按照它写的方式工作的; 但是,XmlSerializer需要typeof(SomeClass)意味着我必须为这个类提供可能需要它的所有可能的类以及两个操作数据的特定方法.
喜欢:

    public void SaveMonsterData(object objGraph, string fileName)
    {
        XmlSerializer xmlFormat = new XmlSerializer(typeof(MonsterBaseInfo));

        using (Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            xmlFormat.Serialize(fileStream, objGraph);
        }   
    }
Run Code Online (Sandbox Code Playgroud)

它是可行的,只是一些简单的复制和粘贴,但似乎是很多不必要的工作.

Eri*_* J. 5

您可以使用通用方法,例如

public void SaveMonsterData<T>(T objGraph, string fileName)
{
    XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
    using (Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        xmlFormat.Serialize(fileStream, objGraph);
    }       
}

public T LoadMonsterData<T>(string fileName)
{
    XmlSerializer xmlDeformat = new XmlSerializer(typeof(T));

    T t;
    using (StreamReader fileStream = new StreamReader(fileName))
    {
        t = (T)xmlDeformat.Deserialize(fileStream);
    }

    return t;
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个名为Npc的类,你可以使用如下方法:

Npc npc;
SaveMonsterData<Npc>(npc, fileName);
Run Code Online (Sandbox Code Playgroud)