通用抽象字符串转换器

时间:2016-06-16 08:50:34

标签: c# generics

我正在尝试将基于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的变量而不将泛型传递给包含它的类,我想避免使用它。

1 个答案:

答案 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类型。