如何从PropertyInfo获取枚举类以调用泛型枚举扩展方法?
解决通过PropertyInfo调用泛型枚举扩展方法的问题
核心问题在于:泛型方法的类型参数需要编译时确定,但通过property.PropertyType拿到的是运行时Type对象,无法直接作为泛型参数传入。这时需要通过反射调用泛型方法来实现需求,具体步骤如下:
1. 获取扩展方法的MethodInfo
首先找到你的泛型扩展方法所在的静态类,通过反射获取该方法的定义:
// 假设扩展方法在EnumExtensions这个静态类中 var extensionMethod = typeof(EnumExtensions).GetMethod( nameof(EnumExtensions.GetEnumFromDescription), BindingFlags.Public | BindingFlags.Static);
如果存在方法重载,需要精准指定参数类型来避免歧义:
var extensionMethod = typeof(EnumExtensions).GetMethod( nameof(EnumExtensions.GetEnumFromDescription), BindingFlags.Public | BindingFlags.Static, new[] { typeof(string) });
2. 构造对应枚举类型的泛型方法
用当前枚举属性的Type,构造出该泛型方法的具体版本:
var genericMethod = extensionMethod.MakeGenericMethod(property.PropertyType);
3. 调用构造好的泛型方法
扩展方法本质是静态方法,this参数对应第一个传入的实参,直接通过Invoke调用即可:
string targetDescription = "Two"; // 你要转换的描述文本 var enumResult = genericMethod.Invoke(null, new object[] { targetDescription });
Invoke第一个参数传null,因为是静态方法,不需要实例对象- 返回结果是
object类型,若需要强转,可通过Convert.ChangeType适配枚举类型:var typedEnum = Convert.ChangeType(enumResult, property.PropertyType);
完整示例代码
结合你的场景,遍历PropertyInfo时的完整逻辑:
PropertyInfo[] properties = typeof(TItem).GetProperties(); foreach (var property in properties) { if (property.PropertyType.IsEnum) { // 获取扩展方法定义 var extensionMethod = typeof(EnumExtensions).GetMethod( nameof(EnumExtensions.GetEnumFromDescription), BindingFlags.Public | BindingFlags.Static); // 构造泛型方法 var genericMethod = extensionMethod.MakeGenericMethod(property.PropertyType); // 调用方法并获取结果 string description = "Two"; var enumValue = genericMethod.Invoke(null, new object[] { description }); // 示例:将结果赋值给TItem实例的对应属性 // TItem item = ...; // property.SetValue(item, enumValue); } }
注意事项
- 确保扩展方法所在的类和方法本身都是
public访问级别,否则反射无法获取到方法定义 - 如果扩展方法有非默认的绑定约束(比如内部类),需要调整
BindingFlags参数
内容的提问来源于stack exchange,提问作者ISquared
相关产品推荐
相关产品推荐

