C#重载IEnumerable键/值类型和非键/值

时间:2019-01-18 08:42:29

标签: c#

我希望键/值类型调用Execute<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> enums),非键/值类型调用Execute<T>(this IEnumerable<T> enums)

但是Dictionary对象将调用Execute<T>(this IEnumerable<T> enums)而不是Execute<TKey, TValue>(this ICollection<KeyValuePair<TKey, TValue>> enums)

例如:

void Main(){
    var keyValueTypeData = new[] {
        new Dictionary<string, string> (){{"Name" , "ITWeiHan" }}
    }.AsEnumerable();
    keyValueTypeData.Execute(); //call Execute<T>

    var nonKeyValueTypeData = new[] {new {Name ="ITWeiHan" }};
    nonKeyValueTypeData.Execute(); //call Execute<T>
}

public static class Test
{
    public static void Execute<TKey, TValue>(this IEnumerable<IEnumerable<KeyValuePair<TKey, TValue>>> enums){}

    public static void Execute<T>(this IEnumerable<T> enums){}
}

2 个答案:

答案 0 :(得分:3)

Dictionary的数组不是{strong>不是的IEnumerable的{​​{1}}(单个KeyValuePair是-但这不是您所拥有的) )。

我怀疑您的意思是:

Dictionary

请注意,解决方案的一部分是明确说明类型,以确保“鼓励”编译器选择我要选择的方法。

即我使用using System.Collections.Generic; namespace Test { public static class Test { public static void Execute<TKey, TValue>(this IEnumerable<IEnumerable<KeyValuePair<TKey, TValue>>> enums) { } public static void Execute<T>(this IEnumerable<T> enums) { } } public class Program { public static void Main() { IEnumerable<IEnumerable<KeyValuePair<string, string>>> data = new[] { new Dictionary<string, string> (){ {"Name" , "ITWeiHan" } } }; data.Execute(); } } } 而不是IEnumerable<IEnumerable<KeyValuePair<string, string>>>

答案 1 :(得分:2)

尝试一下:

static void Main()
{
    var keyValueTypeData = new[] {
        new Dictionary<string, string> (){{"Name" , "ITWeiHan" }}
    };
    keyValueTypeData.SelectMany(x => x.AsEnumerable()).Execute(); //call Execute<TKey, TValue>

    var nonKeyValueTypeData = new[] { new { Name = "ITWeiHan" } };
    nonKeyValueTypeData.Execute(); //call Execute<T>
}

请注意SelectMany()AsEnumerable()的使用。