如何创建一个泛型类,它允许具有构造函数的类型接受一个字符串参数并实现 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/