You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:54:00