C#中如何正确创建带泛型Func<T,TResult>参数的扩展方法?
如何正确创建接收Func<T,TResult>的字符串扩展方法?
我来帮你拆解下这个问题哈~首先得搞清楚你报错的原因:你的扩展方法是专门给string类型写的(this string s),但方法里的泛型参数T是完全独立的,编译器根本不知道T和string有啥关联,所以当你把string类型的s传给需要T类型参数的委托f时,自然就会出现类型转换失败的错误啦。
接下来给你两种针对性的解决方案,你可以根据实际需求来选:
方案一:只针对字符串的扩展方法
如果你的扩展方法就是给string用的,那完全不需要泛型T,直接把委托的输入类型固定为string就好:
public static class MyExtensions { public static TResult ModifyString<TResult>(this string s, Func<string, TResult> f) { return f(s); } }
用法示例
这样你就能轻松对字符串做各种转换操作了:
string original = "hello world"; // 转成大写 string upperStr = original.ModifyString(str => str.ToUpper()); // 获取字符串长度 int strLength = original.ModifyString(str => str.Length); // 反转字符串 string reversedStr = original.ModifyString(str => new string(str.Reverse().ToArray()));
方案二:通用型扩展方法(支持任意类型)
如果你想让这个扩展方法适用于所有类型,而不只是string,那可以把扩展方法的this参数也改成泛型T,这样委托的输入类型就和扩展的目标类型完全匹配了:
public static class MyExtensions { public static TResult Modify<T, TResult>(this T input, Func<T, TResult> f) { return f(input); } }
用法示例
这个版本灵活性拉满,不管是字符串、数字还是自定义类型都能用:
// 处理字符串 string original = "hello"; string reversed = original.Modify(str => new string(str.Reverse().ToArray())); // 处理数字 int num = 10; int doubled = num.Modify(n => n * 2); // 处理自定义类型 var person = new { Name = "Joel", Age = 30 }; string personInfo = person.Modify(p => $"Name: {p.Name}, Age: {p.Age}");
总结一下:如果只是给字符串做扩展,选方案一最直接;如果需要通用能力,就用方案二的泛型扩展方法~
内容的提问来源于stack exchange,提问作者Joels Elf
相关产品推荐
相关产品推荐

