如何处理 C# 接口中的可选可变参数?

问题描述 投票:0回答:1

我正在尝试为我的 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# .net mapping asp.net-core-webapi
1个回答
0
投票

可变 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
数组扮演多态对象集的角色。从这一点来说,它和其他阵法并没有什么不同。唯一的区别是可变参数形式的语法糖

我希望它能解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.