我正在尝试将基于Action和Func的转换器转换为类,以便我可以快速地将它们交换进去,并且最小化。
接受它们的类显然必须将转换器存储为变量
private Converter converter;
到目前为止我的课程定义是:
public abstract class Converter<T>
{
public abstract bool Convert(string str, out T val);
}
public class StringToFooConverter : Converter<Foo>
{
public override bool Convert(string str, out Foo val)
{
//do the parsing here
}
}
但是我显然无法创建抽象泛型类Converter的变量而不将泛型传递给包含它的类,我想避免使用它。
答案 0 :(得分:4)
创建非泛型接口并在抽象类中实现它
interface IConverter
{
bool Convert(string str, out object val);
}
public abstract class Converter<T> : IConverter
{
public abstract bool Convert(string str, out T val);
bool IConverter.Convert(string str, out object val)
{
T result = default(T);
var success = this.Convert(str, out result);
val = result;
return success;
}
}
public class StringToFooConverter : Converter<Foo>
{
public override bool Convert(string str, out Foo val)
{
//do the parsing here
}
}
正如您所看到的,interface-method只是调用抽象(泛型)方法。因此,你现在可以这样写:
object anyOutObject;
IConverter myConverter = new StringToFooConverter();
myConverter.Convert(myString, out anyObject);
但是,由于您未提供通用类型,因此必须将anyObject
投射到实际的Foo
类型。