c# - 带有字符串参数的构造函数的通用约束?

标签 c# generics c#-2.0 constraints filehelpers

如何创建一个泛型类,它允许具有构造函数的类型接受一个字符串参数并实现 ToString 并实现如下两个函数。

    class Convert<T>:ConverterBase
        where T:new()
    {

        public override object StringToField(string from)
        {
            try
            {
                return new T(from);
            }
            catch (ArgumentException exception)
            {
                ThrowConvertException(from, exception.Message);
                return null;
            }
        }

        public override string FieldToString(object from)
        {
            return from.ToString();
        }

    }

注意: ConvertBase 是 FileHelpers csv 阅读器库中的一个抽象类。我已经在 csv 中拥有对应于我的字段的类,不想创建继承 ConvertBase 的单独类以便与 FileHelpres 库一起使用。

最佳答案

无法使用构造函数约束 ( new() ) 来约束除空构造函数之外的任何内容。不过,解决此问题的一种方法是使用 lambda 表达式。例如

class Convert<T>:ConverterBase {
  private Func<string, T> _factory;
  public (Func<string, T> factory) {
    _factory = factory;
  }

  public override object StringToField(string from) {
    try {
      return _factory(from);
    } ...
  }
}

现在我可以创建 Convert<T> 的实例了并使用 lambda 表达式转发给该类型的构造函数

new Convert<Foo>(s => new Foo(s));

编辑 C# 2.0 实现,因为 OP 坚持使用 2.0

public delegate TResult Func<T, TResult>(T arg);

new Convert<Foo>(delegate (string s) { return new Foo(s); });

关于c# - 带有字符串参数的构造函数的通用约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5496212/

相关文章:

java - 什么是原始类型,为什么我们不应该使用它呢?

c# - 如何将字典的值复制到 .Net 2.0 中的 IList 对象中?

c# - 在 APS.NET Core 2 应用程序中使用(并强制执行)HTTPS

c# - 将 OpenXML 创建的 Excel 电子表格导出到客户端

java - 在 gwt 编辑器中应用 java 泛型

c# - 按钮在 Windows 7 上有黑色背景

c# - 插件示例

c# - 如何选择与列表中所有 ID 匹配的所有对象?

c# - 使用 C# ASP.NET WebAPI 2.0 在 InputModel 主体中绑定(bind) NodaTime Instant 字段

java - 这个方法签名是什么意思?