【发布时间】:2015-03-07 22:25:11
【问题描述】:
我有一个适用于任何类的扩展方法,但如果我正在处理IEnumerable<T>,我想调用一个特殊版本。
举例
public static class ExtensionMethods
{
public static dynamic Test<T>(this T source)
{
dynamic expandoObject = new System.Dynamic.ExpandoObject();
var dictionary = (IDictionary<string,object>)expandoObject;
dictionary["Test"] = source.ToString();
return dictionary;
}
public static IEnumerable<dynamic> Test<T>(this List<T> source)
{
var result = new List<dynamic>();
foreach(var r in source)
yield return r.Test();
}
public static IEnumerable<dynamic> Test<T>(this IEnumerable<T> source)
{
var result = new List<dynamic>();
foreach(var r in source)
yield return r.Test();
}
}
// 用法
public class X
{
string guid = Guid.NewGuid().ToString();
}
void Main()
{
List<X> list = new List<X>() { new X() };
list.Test().Dump(); // Correct but only works because there is an explicit overload for List<T>
var array = list.ToArray();
((IEnumerable<X>) array).Test().Dump(); // Correct
array.Test().Dump(); // Calls the wrong extension method
}
有什么方法可以让 array.Test() 调用 IEnumerable 版本而无需显式转换它?
或者,如果我为扩展方法指定不同的名称,如果我不小心使用了错误的方法,是否会出现编译器错误?
【问题讨论】:
-
数组继承自 IEnumerable?
-
你可以试试
AsEnumerable(),但这只是转换为IEnumerable的最好和最短的方法:array.AsEnumerable().Test(); -
数组实现了
IEnumerable<T>,但该实现是在运行时添加的,这就是调用“错误”扩展方法的原因。
标签: c# extension-methods