不过专门为string写个扩展,这个问题可以化解,如下:
public static string If(this string s, Predicate<string> predicate, Func<string, string> func)
{
return predicate(s) ? func(s) : s;
}
{
return predicate(s) ? func(s) : s;
}
看来扩展方法也是有优先级的:对同一个类进行多次扩展,扩展方法相名,参数也等效(数量、顺序相同),非泛版扩展要比泛型版扩展优先级高。
下面再来看一段swith代码,很啰嗦的!这里是为了引出扩展硬写出来的:
public static void Test4()
{
string englishName = "apple";
string chineseName = string.Empty;
switch (englishName)
{
case "apple":
chineseName = "苹果";
return;
case "orange":
chineseName = "桔子";
return;
case "banana":
chineseName = "香蕉";
return;
case "pear":
chineseName = "梨";
break;
default:
chineseName = "未知";
break;
}
Console.WriteLine(chineseName);
}
{
string englishName = "apple";
string chineseName = string.Empty;
switch (englishName)
{
case "apple":
chineseName = "苹果";
return;
case "orange":
chineseName = "桔子";
return;
case "banana":
chineseName = "香蕉";
return;
case "pear":
chineseName = "梨";
break;
default:
chineseName = "未知";
break;
}
Console.WriteLine(chineseName);
}
我们把这种方式用扩展方法来完成:
public static TOutput Switch<TOutput, TInput>(this TInput input, IEnumerable<TInput> inputSource, IEnumerable<TOutput> outputSource, TOutput defaultOutput)
{
IEnumerator<TInput> inputIterator = inputSource.GetEnumerator();
IEnumerator<TOutput> outputIterator = outputSource.GetEnumerator();
TOutput result = defaultOutput;
while (inputIterator.MoveNext())
{
if (outputIterator.MoveNext())
{
if (input.Equals(inputIterator.Current))
{
result = outputIterator.Current;
break;
}
}
else break;
}
return result;
}
{
IEnumerator<TInput> inputIterator = inputSource.GetEnumerator();
IEnumerator<TOutput> outputIterator = outputSource.GetEnumerator();
TOutput result = defaultOutput;
while (inputIterator.MoveNext())
{
if (outputIterator.MoveNext())
{
if (input.Equals(inputIterator.Current))
{
result = outputIterator.Current;
break;
}
}
else break;
}
return result;
}