如何将扩展帮助器方法实现为具有可变参数的抽象类?

时间:2019-04-10 17:49:13

标签: c#

为了减少整个存储库中从另一个库获取值的重用代码,我想创建扩展方法以将一个类“解析”(因为缺少一个更好的词)。如何实现具有不同参数的抽象方法。

我找不到能回答我问题的任何东西,而且我不确定这是否可以解决。

不要在多个地方都这样。

var list = _library.GetList();
var model = list.Select(o => new ClassA()
{
   ID = o.ID, 
   Name = o.Name
}).ToList<ClassA>();

我想要扩展方法,这样我就可以调用

var list = _library.GetList();
var model = ExtensionClass.ParseMany(list);

但是,我想以抽象类为基础,以便可以由多个不同的类重用,所以我有

public abstract class Parser<U, T> where T : class where U : class 
{
   public abstract T ParseOne(U parser);
   public abstract IEnumerable<T> ParseMany(IEnumerable<U> parser); 
}

public class ParseA<ClassA, ClassADTO> 
{
   public override ClassA ParseOne(ClassADTO parser){ // }
}

但是似乎传入的参数似乎不是实际的对象,它说这是一个KeyValuePair,现在我迷路了。

我希望能够根据我的参数返回一个新实例,基本上是我已经在代码中多次执行的操作。

1 个答案:

答案 0 :(得分:0)

我想您可以使用Func拥有一个通用解析器。我只是写了一个示例,希望对您有帮助。

public class ClassA
{
    public int SomeNumber { get; set; }

    public string SomeString { get; set; }
}

public class ClassB
{
    public int OtherNumber { get; set; }

    public string OtherString { get; set; }
}

public static class ExecuteParsingFunction
{
    public static TDestiny Parse<TOrigin, TDestiny>(TOrigin origin,
                                Func<TOrigin, TDestiny> parserFunction)
    {
        return parserFunction(origin);
    }
}

public static class ParsingFunctions
{
    public static ClassB ParseAToB(ClassA a)
    {
        return new ClassB { OtherNumber = a.SomeNumber, OtherString = a.SomeString };
    }

    public static IEnumerable<ClassB> ParseManyAToB(IEnumerable<ClassA> aCollection)
    {
        foreach(var a in aCollection)
            yield return ParseAToB(a);
    }
}

public void Sample()
{
    var a = new ClassA { SomeNumber = 1, SomeString = "Test" };
    var manyAs = new List<ClassA> { a };

    var b = ExecuteParsingFunction.Parse(a, ParserFunctions.ParseAToB);
    var manyBs = ExecuteParsingFunction.Parse(manyAs, ParserFunctions.ParseManyAToB);
}