.NET Framework 4.8泛型函数中跨方法访问类字段的问题
.NET Framework 4.8泛型函数中跨方法访问类字段的问题
嘿,我一眼就瞅出问题所在啦!你在MergeClasses方法里调用hasName的时候,硬编码写死了x => x.name这个委托,但其实你早就把获取名称的逻辑通过ClassName参数传进MergeClasses里了,完全没必要自己再指定字段名呀!
问题根源
MergeClasses是泛型方法,它根本不知道T类型里有没有name这个字段——这也是你一开始用Func<T, string> ClassName委托的原因:让调用方来决定怎么从T实例里取出名称。但你在调用hasName时又绕回去硬写了字段访问,这不仅违背了泛型方法的设计初衷,还会导致如果T类型没有name字段时直接编译报错。
解决方法
直接把MergeClasses收到的ClassName委托传给hasName就好了,不用重新写一遍逻辑:
修改后的MergeClasses代码:
public List<T> MergeClasses<T>(List<T> Pri, List<T> Sec, Func<T, string> ClassName) { List<T> result = new List<T>(); result.AddRange(Pri); // 直接传入ClassName委托,而不是硬写x=>x.name foreach (T entry in Sec) { if (!new Functions().hasName(result, ClassName(entry), ClassName)) { result.Add(entry); } } return result; }
额外优化建议
- 把
hasName改成静态方法:每次调用都new Functions()有点没必要,改成静态方法可以避免不必要的对象实例化:
public static bool hasName<T>(List<T> Data, string name, Func<T, string> ClassName) { foreach (T entry in Data) { if (ClassName(entry) == name) { return true; } } return false; }
调用时直接写Functions.hasName(...)即可。
- 用LINQ简化
hasName逻辑:.NET的LINQ库提供了Any方法,可以一行代码实现你的判断逻辑,更简洁高效:
public static bool hasName<T>(List<T> Data, string name, Func<T, string> ClassName) { return Data.Any(entry => ClassName(entry) == name); }
这样修改后,你的泛型方法就能完美适配任何拥有“名称”属性的类型,不用再依赖具体的字段名啦!
备注:内容来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

