我可以使用可变数量的通用参数吗?

Ric*_*ett 36 .net c# generics parameters

在我的项目中,我有以下三个接口,这些接口由管理合并具有不同结构的各种业务对象的类实现.

public interface IMerger<TSource, TDestination>
{
    TDestination Merge(TSource source, TDestination destination);
}

public interface ITwoWayMerger<TSource1, TSource2, TDestination>
{
    TDestination Merge(TSource1 source1, TSource2 source2, TDestination destination);
}

public interface IThreeWayMerger<TSource1, TSource2, TSource3, TDestination>
{
    TDestination Merge(TSource1 source1, TSource2 source2, TSource3 source3, TDestination destination);
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但我宁愿有一个IMerger接口指定可变数量的TSource参数,如下所示(下面的例子使用params;我知道这不是有效的C#):

public interface IMerger<params TSources, TDestination>
{
    TDestination Merge(params TSource sources, TDestination destination);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一点,或功能相同的东西?

Mar*_*ell 29

你不能.这是API的关键部分.但是,你可以做一些事情,比如接受一个Type[]论点.您可能也会想到一些奇特的"流畅的API /扩展方法"这样做的方式,但说实话它可能不值得; 但是像这样:

obj.Merge<FirstType>(firstData).Merge<SecondType>(secondData)
     .Merge<ThirdType>(thirdData).Execute<TDestination>(dest);
Run Code Online (Sandbox Code Playgroud)

或使用泛型类型推断:

obj.Merge(firstData).Merge(secondData).Merge(thirdData).Execute(dest);
Run Code Online (Sandbox Code Playgroud)

每个合并步骤都可以简单地存储要执行的工作,只能通过访问Execute.

  • 但是,问题"`TSource1 source1,TSource2 source2,TSource3 source3`"也是如此...... (8认同)
  • 我的想法是source1 .. sourcen表示"这些是源",而.Merge调用链表明合并是以特定顺序发生的. (2认同)

Chr*_*ter 5

这取决于您是否希望对象能够合并不同类型的对象.

对于同构合并,您只需要:

public interface IMerger<TSource, TDestination> {
    TDestination Merge(IEnumerable<TSource> sources, TDestination destination);
}
Run Code Online (Sandbox Code Playgroud)

对于异构合并,请考虑要求所有源类型派生自公共基类型:

public interface IMerger<TSourceBase, TDestination> {
    TDestination Merge(IEnumerable<TSourceBase> sources, TDestination destination);
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何param数组的需要,只需传入对象集合.