C#多态与泛型类型和列表

时间:2016-06-03 11:42:34

标签: c# generics polymorphism

也许我的问题很简单或只是愚蠢但我有以下问题:

我有2种多态方法:

public void Index<T>(string alias, IEnumerable<T> items) where T : class
{
    var result = Client.IndexMany(items, alias);
    ExceptionHandling(result);
}

public void Index<T>(string alias, T item) where T : class
{
    var result = Client.Index(item, x => x.Index(alias));
    ExceptionHandling(result);
}

当我现在尝试使用以下命令调用获得List的方法时:

ClientService.Index(Alias, items.ToList());

始终调用方法Index<T>(string alias, T item)。如何更改列表调用第一个方法,单个对象调用第二个方法?

3 个答案:

答案 0 :(得分:2)

我有另一种解决方案!

您可以使用参数名称来区分重载!

你看,第一个重载的第二个参数叫做items,而第二个重载的第二个参数叫做item。因此,如果要调用第一个重载,则只需:

ClientService.Index(Alias, items: items.ToList());

如果你想要第二个,你可以打电话:

ClientService.Index(Alias, item: items.ToList());

看到区别?

干净整洁!在chsarppad上进行了测试:http://csharppad.com/gist/0d7f71c66079fefa680ea3f6afb2ed63

答案 1 :(得分:1)

这是一个方法(重载)具有相同名称的问题,其中两个重载明显地做了不同的事情 - 你有一个解决方案的提示;在其他地方,您已将下游方法命名为IndexIndexMany

您的两个选项是

  1. Name the methods differently, and appropriately
  2. Explicitly cast your list to an IEnumerable<T> using AsEnumerable() extension method.

答案 2 :(得分:1)

您可以指定通用参数类型,例如

ClientService.Index<Item>(Alias, items.ToList());