如何实现支持传入对象属性列表的函数参数?
解决方案
要实现带智能提示的属性选择功能,核心是利用泛型+强类型委托/匿名类型,让编译器提供属性提示,同时避免硬编码属性名。以下是两种贴合需求的实现方式:
方式1:直接接收匿名对象参数
这种方式和你给出的理想示例完全匹配,调用时直接传入包含目标属性的匿名对象,编译器会自动推断类型并提供智能提示:
class Cases { // 泛型方法接收任意匿名类型(或自定义投影类型) public void DoStuff<TProjection>(TProjection projection) where TProjection : class { // 通过反射获取投影对象的属性信息 var properties = typeof(TProjection).GetProperties(); foreach (var prop in properties) { string propName = prop.Name; object propValue = prop.GetValue(projection); // 这里替换为你的业务逻辑,比如记录属性、生成SQL片段等 Console.WriteLine($"属性名:{propName},值:{propValue}"); } } public string Caption { get; set; } public int ID_Case { get; set; } public int ID_Type { get; set; } }
调用示例
var c = new Cases { Caption = "客户投诉案例", ID_Type = 2 }; // 输入c.时会自动弹出Cases的所有属性,智能提示生效 c.DoStuff(new { c.Caption, c.ID_Type });
方式2:用Lambda选择器(更贴近EF Select的用法)
如果需要更灵活的属性转换或逻辑处理,可以用Func<TSource, TProjection>作为参数,这和EF Select的用法一致,智能提示同样完整:
class Cases { public void DoStuff<TProjection>(Func<Cases, TProjection> projectionSelector) where TProjection : class { // 利用当前实例生成投影对象 var projection = projectionSelector(this); // 后续反射处理逻辑和方式1一致 var properties = typeof(TProjection).GetProperties(); foreach (var prop in properties) { string propName = prop.Name; object propValue = prop.GetValue(projection); Console.WriteLine($"属性名:{propName},值:{propValue}"); } } public string Caption { get; set; } public int ID_Case { get; set; } public int ID_Type { get; set; } }
调用示例
var c = new Cases { Caption = "客户投诉案例", ID_Type = 2 }; // 输入x.时会弹出Cases的所有属性,还可以对属性做转换 c.DoStuff(x => new { x.Caption, 大写标题 = x.Caption.ToUpper(), x.ID_Type });
核心优势
- 完全依赖强类型,输入属性时有完整的智能提示,避免拼写错误。
- 无需使用
nameof硬编码属性名,代码更易维护。 - 泛型自动推断类型,无需手动指定,使用体验流畅。
内容的提问来源于stack exchange,提问作者AngryHacker
相关产品推荐
相关产品推荐

