1

文字列を解析して引数から取得したタイプにするための最良の方法は何ですか?

現在、次の関数を使用してXMLノードを解析していますが、汎用的にしたいと考えています。

    private void ParseSettings(XmlDocument doc)
    {
        IsFormVisible = (bool) ParseNode(doc, "Settings/IsFormVisible", IsFormVisible);
        UpdaterRunInterval = (int) ParseNode(doc, "Settings/UpdaterRunInterval", UpdaterRunInterval);
        UpdaterLastRunTime = (DateTime) ParseNode(doc, "Settings/UpdaterLastRunTime", UpdaterLastRunTime);
    }

    private object ParseNode(XmlDocument doc, string node, object defaultValue)
    {
        try
        {
            XmlNode xmlNode = doc.SelectSingleNode(node);
            if (xmlNode == null)
                return defaultValue;
            string text = xmlNode.InnerText;
            if (defaultValue is int)
                return int.Parse(text);
            if (defaultValue is bool)
                return bool.Parse(text);
            if (defaultValue is string)
                return text;
            if (defaultValue is DateTime)
                return DateTime.Parse(text);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return defaultValue;
    }
4

2 に答える 2

2
private T ParseNode<T>(XmlDocument doc, string node, T defaultValue)
{
    try
    {
        XmlNode xmlNode = doc.SelectSingleNode(node);
        if (xmlNode == null)
            return defaultValue;
        string text = xmlNode.InnerText;
        return SafeConvert(text, defaultValue);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return defaultValue;
}

public static T SafeConvert<T>(string s, T defaultValue)
{
    if ( string.IsNullOrEmpty(s) )
        return defaultValue;
    return (T)Convert.ChangeType(s, typeof(T));
}
于 2013-03-05T11:27:00.700 に答える
1

次のようなものを試してください:

private static T ParseNode<T>(XmlDocument doc, string node, object defaultValue)
{
    object ret = defaultValue;
    try
    {

        XmlNode xmlNode = doc.SelectSingleNode(node);
        if (xmlNode == null)
            return default(T);
        string text = xmlNode.InnerText;
        if (defaultValue is int)
            ret = int.Parse(text);
        if (defaultValue is bool)
            ret =  bool.Parse(text);
        if (defaultValue is string)
            ret = text;
        if (defaultValue is DateTime)
            ret = DateTime.Parse(text);

        return (T) ret;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return (T)ret;
}

私はそれを保証することはできません、これはそれを行うための完璧な方法ですが、それは機能します!

    IsFormVisible = ParseNode<bool>(doc, "Settings/IsFormVisible", true);
    UpdaterRunInterval = ParseNode<int>(doc, "Settings/UpdaterRunInterval", 1);
    UpdaterLastRunTime = ParseNode<DateTime>(doc, "Settings/UpdaterLastRunTime", 1);
于 2013-03-05T11:17:32.673 に答える