为了减少整个存储库中从另一个库获取值的重用代码,我想创建扩展方法以将一个类“解析”(因为缺少一个更好的词)。如何实现具有不同参数的抽象方法。
我找不到能回答我问题的任何东西,而且我不确定这是否可以解决。
不要在多个地方都这样。
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,现在我迷路了。
我希望能够根据我的参数返回一个新实例,基本上是我已经在代码中多次执行的操作。
答案 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);
}