Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用抽象字符串转换器_C#_Generics - Fatal编程技术网

C# 通用抽象字符串转换器

C# 通用抽象字符串转换器,c#,generics,C#,Generics,我正在尝试将基于Action和Func的转换器转换为类,以便能够以最小的麻烦快速地交换它们 接受它们的类显然必须将转换器存储为变量 private Converter converter; 到目前为止,我的类定义是: public abstract class Converter<T> { public abstract bool Convert(string str, out T val); } public class StringToFooConverter : C

我正在尝试将基于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
    }
}
公共抽象类转换器
{
公共抽象布尔转换(字符串str,out T val);
}
公共类StringToFoodConverter:转换器
{
公共覆盖布尔转换(字符串str,out Foo val)
{
//在这里进行解析
}
}

但是,如果不将泛型传递给包含它的类,我显然无法创建抽象泛型类转换器的变量,这是我要避免的。

创建一个非泛型接口并在抽象类中实现它

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
    }
}

但是,由于没有提供泛型类型,您必须将
anyObject
强制转换为实际的
Foo
-type。

创建一个非泛型接口,并在抽象类中实现它

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
    }
}

但是,由于您没有提供泛型类型,您必须将
anyObject
转换为实际的
Foo
-类型。

如何实现由抽象类实现的非泛型接口?@HimBromBeere我读到了一些类似的内容,但我很难想到一个适合我的接口在没有泛型的情况下实现它?你知道该接口中函数的签名是什么吗?实现一个由抽象类实现的非泛型接口怎么样?@HimBromBeere我读了一些类似的东西,但是我很难想到一个合适的接口,我可以在没有泛型的情况下实现它?你知道该函数的签名在界面中是什么吗?太棒了!我有使用对象的实现,但我无法完成最后一步。非常感谢。刚刚看到你的编辑;如果我想避免转换,您对传递泛型类型有什么建议?您不能,因为接口没有关于泛型约束的任何线索。然而,我认为这正是您不想使用
Converter=new-stringtofoodconverter()
的原因?如果要调用返回对象上的
Foo
的任何成员,必须以任何方式提供
Foo
-类型。因此,要么施展,要么使用你目前的方法。我也这么想,你的假设是正确的。这基本上是我在这个实现中遇到的问题。我不希望使用转换器的类必须进行自己的强制转换或保存任何这些信息,但我想不出一种方法来避免它。我想也许我现在应该坚持使用代理。太棒了!我有使用对象的实现,但我无法完成最后一步。非常感谢。刚刚看到你的编辑;如果我想避免转换,您对传递泛型类型有什么建议?您不能,因为接口没有关于泛型约束的任何线索。然而,我认为这正是您不想使用
Converter=new-stringtofoodconverter()
的原因?如果要调用返回对象上的
Foo
的任何成员,必须以任何方式提供
Foo
-类型。因此,要么施展,要么使用你目前的方法。我也这么想,你的假设是正确的。这基本上是我在这个实现中遇到的问题。我不希望使用转换器的类必须进行自己的强制转换或保存任何这些信息,但我想不出一种方法来避免它。我想也许我现在应该坚持使用代理。