我有一个扩展方法,可以作用于任何类,但如果我在处理
例如:
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版本而不必显式转换?
另外,如果我给扩展方法起不同的名称,是否有办法在不小心使用错误的方法时得到编译器错误提示?
AsEnumerable()
,但这只是将数组转换为IEnumerable
的最简单和最优雅的方式:`array.AsEnumerable().Test();`
- Farhad JabiyevIEnumerable<T>
,但是实现是在运行时添加的,这就是为什么会调用“错误”的扩展方法。 - Magnus