C#使方法更通用以便重复使用,有更好的方法吗?

时间:2016-06-23 15:42:58

标签: c# generics

我想这不是一个大问题,因为我通过或多或少的猜测编码,有效。我显然没有在谷歌上使用正确的术语,因为在通用类型部分之外,我已经出现并且必须测试其余的以确认功能。

我选择了这样的方法:

    private void SaveHw()
    {
        XmlSerializer xml = new XmlSerializer(typeof(List<Hardware>));
        try
        {
            using (StreamWriter sw = new StreamWriter(fileHw))
            {
                xml.Serialize(sw, lstHw);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed to update local hardware XML.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

到此:

    private void SaveList<T>(List<T> lst, string file)
    {
        XmlSerializer xml = new XmlSerializer(typeof(List<T>));
        try
        {
            using (StreamWriter sw = new StreamWriter(file))
            {
                xml.Serialize(sw, lst);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed to update local hardware XML.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

和这个

        private List<T> LoadList<T>(List<T> lst, string file)
    {
        // don't bother if the file does not exist.
        if (File.Exists(file))
        {
            // straight forward
            XmlSerializer xml = new XmlSerializer(typeof(List<T>));
            try
            {
                using (StreamReader sr = new StreamReader(file))
                {
                    return (List<T>)xml.Deserialize(sr);
                }
            }
            catch
            {
                MessageBox.Show("Failed to load local hardware XML.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        return new List<T>();
    }

操纵我所知道的一些数据的其他轻微的通用变体将出现在所使用的任何列表中。

我的问题是,有更好的方法吗?这些不是大的自定义东西,所以它们只是列表中的结构。这个数据最终应该是一个db,所以我不想使用类。

1 个答案:

答案 0 :(得分:3)

我要添加的唯一内容是使类更加可扩展,是一种更通用的输入加载\保存方式,使用数据加载接口作为load \ save函数的输入

private IEnumerable<T> LoadData<T>(IEnumerable<T> list, IDataLoader loader)
{ 
     ...
}

interface IDataLoader 
{
      StreamReader Load(...);
      StreamWriter Save(...); 
}

和一个更多并发的文件输入类

class FileDataLoader : IDataLoader 
{
     ...
}

这种方式如果将来例如添加了DB,则不需要对LoadData进行任何更改