我希望键/值类型调用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){}
}
答案 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()
的使用。