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

.Net如何通过反射创建对象传入泛型MapToList方法

解决泛型映射方法的反射调用问题

问题核心:MapToList<TSource, TDestination>需要的是类型参数,而你手里的refobj是个实例对象,不能直接把对象当作类型传给泛型方法。要解决这个问题,得通过反射动态构造泛型方法并调用,步骤如下:

具体实现步骤

  1. 获取实例的实际类型:从refobj拿到它对应的Type对象,这就是你要的TSource类型
  2. 确定目标类型TDestination:提前明确你的目标实体类型(比如typeof(UserDto))
  3. 动态构造泛型方法:获取MapToList的泛型定义,用上面两个类型参数生成具体的方法实例
  4. 调用构造好的方法:通过反射Invoke执行方法,传入refobj作为参数

代码示例

假设你的自定义映射器类是CustomMapper,MapToList是静态方法:

// 你的自定义映射器类(示例)
public class CustomMapper
{
    public static List<TDestination> MapToList<TSource, TDestination>(TSource source)
    {
        // 内部映射逻辑实现
        return new List<TDestination>();
    }
}

// 你的现有代码
string sourcename = "YourNamespace.YourSourceType"; // 替换成你的类名
var refobj = Assembly.GetExecutingAssembly().CreateInstance(sourcename);
if (refobj == null)
{
    // 处理实例创建失败的情况
    return;
}

// 1. 获取源对象的实际类型
Type sourceType = refobj.GetType();
// 2. 指定目标类型(替换成你的实际目标类型)
Type destinationType = typeof(YourDestinationType);

// 3. 获取并构造泛型方法
MethodInfo mapMethod = typeof(CustomMapper).GetMethod("MapToList")
    ?.MakeGenericMethod(sourceType, destinationType);

if (mapMethod == null)
{
    // 处理方法找不到的情况(比如方法名写错、访问权限问题)
    return;
}

// 4. 调用方法:静态方法第一个参数传null,实例方法传映射器实例
List<YourDestinationType> result = mapMethod.Invoke(null, new object[] { refobj }) as List<YourDestinationType>;

关键注意点

  • 如果MapToList是实例方法,调用Invoke时第一个参数要传你的映射器实例(比如new CustomMapper())
  • 要做好空值判断:比如CreateInstance可能返回null,GetMethod也可能找不到方法
  • 如果需要处理批量实例(比如多个refobj),可以循环执行上述逻辑

内容的提问来源于stack exchange,提问作者Proliges

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:10