.Net如何通过反射创建对象传入泛型MapToList方法
解决泛型映射方法的反射调用问题
问题核心:MapToList<TSource, TDestination>需要的是类型参数,而你手里的refobj是个实例对象,不能直接把对象当作类型传给泛型方法。要解决这个问题,得通过反射动态构造泛型方法并调用,步骤如下:
具体实现步骤
- 获取实例的实际类型:从
refobj拿到它对应的Type对象,这就是你要的TSource类型 - 确定目标类型TDestination:提前明确你的目标实体类型(比如
typeof(UserDto)) - 动态构造泛型方法:获取
MapToList的泛型定义,用上面两个类型参数生成具体的方法实例 - 调用构造好的方法:通过反射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
相关产品推荐
相关产品推荐

