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_Parsing_Generics - Fatal编程技术网

C# 用于分析对象的通用函数

C# 用于分析对象的通用函数,c#,xml,parsing,generics,C#,Xml,Parsing,Generics,将字符串解析为从参数获取的类型的最佳方法是什么 我目前正在使用以下函数解析XML节点,但希望使其具有通用性 private void ParseSettings(XmlDocument doc) { IsFormVisible = (bool) ParseNode(doc, "Settings/IsFormVisible", IsFormVisible); UpdaterRunInterval = (int) ParseNode(doc, "Set

将字符串解析为从参数获取的类型的最佳方法是什么

我目前正在使用以下函数解析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;
    }
尝试以下方法:

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;
}
private static T ParseNode(XmlDocument doc,string节点,object defaultValue)
{
对象ret=默认值;
尝试
{
XmlNode XmlNode=doc.SelectSingleNode(节点);
if(xmlNode==null)
返回默认值(T);
string text=xmlNode.InnerText;
如果(默认值为int)
ret=int.Parse(文本);
如果(默认值为bool)
ret=bool.Parse(文本);
如果(默认值为字符串)
ret=文本;
如果(默认值为DateTime)
ret=DateTime.Parse(文本);
返回(T)ret;
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
返回(T)ret;
}
我不能保证,这是一个完美的方式做它,但它的工作

    IsFormVisible = ParseNode<bool>(doc, "Settings/IsFormVisible", true);
    UpdaterRunInterval = ParseNode<int>(doc, "Settings/UpdaterRunInterval", 1);
    UpdaterLastRunTime = ParseNode<DateTime>(doc, "Settings/UpdaterLastRunTime", 1);
IsFormVisible=ParseNode(doc,“设置/IsFormVisible”,true);
UpdaterRuntVal=ParseNode(文档,“设置/UpdaterRuntVal”,1);
UpdaterAstruntime=ParseNode(文档“设置/UpdaterAstruntime”,1);
私有T ParseNode(XmlDocument文档,字符串节点,T defaultValue)
{
尝试
{
XmlNode XmlNode=doc.SelectSingleNode(节点);
if(xmlNode==null)
返回默认值;
string text=xmlNode.InnerText;
返回SafeConvert(文本,默认值);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
返回默认值;
}
公共静态T SafeConvert(字符串s,T defaultValue)
{
if(string.IsNullOrEmpty)
返回默认值;
return(T)Convert.ChangeType(s,typeof(T));
}

如果你不认为你可以这样做。我认为您最好使用int.TryPares、bool.TryParse等,如果它们不解析,则返回相应的错误消息。我故意返回默认值,以便重新创建损坏或丢失的节点。我只是不喜欢这样,必须检查类型并为每个类型调用Parse。@miroslavpov-chk答案!即使将方法设置为泛型,您仍然必须检查类型。没有where子句可以应用于泛型方法,在泛型方法中可以执行类似于T.TryParse的操作,因为没有包含所有这些类型共享的Parse或TryParse的基类。
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));
}