C# 如何获取传入Send方法的lambda表达式内的泛型对象属性值
解决方案
你的需求可以通过「自行实例化泛型对象+执行委托赋值」的方式实现,完全不需要从委托中提取实例,也不需要复杂的反射逻辑,核心原理是你传入的Action<T>本质只是一段对T类型实例赋值的逻辑,你只需要主动提供实例,执行这段逻辑就能得到赋值完成的对象。
正确实现代码
如果你的消息类都有无参构造函数,直接加泛型约束即可:
public class Handler { public void Send<T>(Action<T> actionmessage) where T : new() { // 实例化泛型对象 T messageInstance = new T(); // 执行传入的委托,给实例的属性赋值 actionmessage(messageInstance); // 此处的messageInstance已经是赋值完成的对象,可直接用于后续逻辑 // 示例:读取属性值 Console.WriteLine(((MyMessage)(object)messageInstance).ValueA); // 输出10 } }
如果部分消息类没有无参构造函数,可以移除泛型约束,用反射创建实例:
public class Handler { public void Send<T>(Action<T> actionmessage) { // 用Activator创建T类型实例 T messageInstance = (T)Activator.CreateInstance(typeof(T)); actionmessage(messageInstance); // 后续处理逻辑 } }
错误方案说明
你第二种写法报错的原因是参数类型不匹配:调用时传入的是Action<T>类型的委托,而你的方法定义的参数是T类型,自然无法转换。
通用读取属性的实现
如果你需要对任意T类型的实例做通用属性读取,再搭配反射使用即可:
// 拿到赋值后的实例后,遍历所有属性 foreach (var prop in typeof(T).GetProperties()) { var propName = prop.Name; var propValue = prop.GetValue(messageInstance); // 按需处理属性名和属性值 }
这种模式是.NET生态非常常见的配置委托模式,ASP.NET Core的服务配置、EF Core的上下文配置等大量官方API都采用了相同的设计思路。
内容的提问来源于stack exchange,提问作者Vilhelm H.
相关产品推荐
相关产品推荐

