我正在尝试为我的 ASP.NET Core API 项目编写简单的映射器。 (我知道有很多库可以做到这一点,但我想自己做,而不是依赖于额外的依赖项)。
我试图处理这些可选的可变参数,如下所示:
public interface IMapper<TDtoType, TDbType>
{
public TDtoType MapEntityToDto(TDbType toBeMapped, params object[] varargs);
public TDbType MapDtoToEntity(TDtoType toBeMapped, params object[] varargs);
}
它工作得很好,但问题是,在实现者中我需要一直解析可变参数,例如像这样:
public class PositionMapper : IMapper<PositionDto, Position>
{
public PositionDto MapEntityToDto(Position toBeMapped, params object[] varargs) => new()
{
StorageArea = toBeMapped.Storage.Name,
Width = toBeMapped.Width,
Height = toBeMapped.Height,
Depth = toBeMapped.Depth
};
public Position MapDtoToEntity(PositionDto toBeMapped, params object[] varargs) => new()
{
Id = varargs.Length >= 2 && varargs[1] is Guid guid ? guid : Guid.Empty,
Depth = toBeMapped.Depth,
Width = toBeMapped.Width,
Height = toBeMapped.Height,
Storage = varargs[0] as Storage
?? throw new ArgumentNullException(nameof(Storage), "Storage cannot be null"),
Carrier = varargs.Length >= 3 ? varargs[2] as Carrier : null
};
}
我希望有一种强类型的方式来添加多个参数,以提供更好的智能感知和强类型。有人可以帮忙吗?
可变 C# 函数已经是完美的强类型,就像任何数组一样。强类型可以与多态性一起使用,也可以不使用。
由于某种原因,您在没有强类型输入的情况下使用它们。要了解强类型的工作原理,请考虑以下内容:
static void VariadicDemo(params string[] parameters) {
if (parameters.Length > 0) {
string name = parameters[0];
// strongly types
}
}
abstract class Base {
internal abstract int Count { get; }
}
class Derived : Base {
internal override int Count => 10;
}
class AnotherDerived : Base {
internal override int Count => 12;
}
static void PolymorphicVariadicDemo(params Base[] parameters) {
foreach (var parameter in parameters)
System.Console.WriteLine(parameter.Count);
}
static void TextPolymorphicVariadicCall() {
PolymorphicVariadicDemo(
new Derived(),
new AnotherDerived(),
new Derived());
}
在演示的多态变体中,
params
数组扮演多态对象集的角色。从这一点来说,它和其他阵法并没有什么不同。唯一的区别是可变参数形式的语法糖。
我希望它能解决这个问题。