c# - 如何指定 C# 泛型类型必须支持 Parse(string)?

标签 c# generics

我正在尝试为包含 SQL 查询结果的 XML 字符串创建解析器框架。目的是继承泛型类,这些类是用列数据类型实例化的。包含的代码适用于单列类型。将有两列等的额外类。

我需要能够指定泛型类型必须支持 Parse(string) 方法。我该怎么做?

abstract class OneColumnParser<Col1>
{
    abstract string Column1;

    List<Col1> ParseQueryResult(string queryResult)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(queryResult);
        List<Col1> results = new List<Col1>();

        foreach (XmlNode xNode in xDoc.GetElementsByTagName(Column1))
        {
            results.Add(Col1.Parse(xNode.InnerText));
        }
    }
}

当我编译上面的代码时,我在 results.Add() 行得到“‘Col1’是一个‘类型参数’,它在给定的上下文中无效”,因为我没有指定类型必须支持方法。但是如何呢?

最佳答案

一种方法是为您的 Col1 类型定义无参数构造函数和接口(interface):

interface IParseable
{
    void Parse(string text);
}

abstract class OneColumnParser<T> where T : IParseable, new
{
    abstract string Column1;

    List<T> ParseQueryResult<T>(string queryResult)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(queryResult);
        var results = new List<T>();

        foreach (XmlNode xNode in xDoc.GetElementsByTagName(Column1))
        {
            var col = new T();
            col.Parse(xNode.InnerText);
            results.Add(col);
        }
    }
}

关于c# - 如何指定 C# 泛型类型必须支持 Parse(string)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338968/

相关文章:

java - 如何制作一个可以容纳 Class<T> 的通用枚举?

c# - List<T> 的扩展方法不接受 List<int>

c# - 泛型类中类型化对象的比较

java - 在转换中,从 T 转换为 double

c# - 如何在 net.core 3.1 上使用 DI 正确配置身份核心?

c# - Visual Studio - 注释添加额外的缩进

c# - 未绑定(bind)模型项时如何添加 ModelState.AddModelError 消息

c# - 无法在 JAVA 中验证签名,但在 .NET 中验证成功

c# - App.config 与 .ini 文件

generics - 生命周期结束时,通用类型参数不受限制