If I have a MethodInfo on a closed generic Type is there an easy way to switch those types?
比如说,我有一个类似于
我知道对于常规的泛型方法,我可以执行
有趣的是,所有的方法都有相同的
有没有办法用
编辑:更深入地说,对于像
我真的不想在检索成员一次后再进行反射,因为很难解析正被调用的完全相同的方法。
好吧,也许我只是个傻瓜,但为什么这不起作用:
1 2 3 |
为什么卫理公会说它是
你可以用
1 2 3 4 5 6 |
这个链接包括上面的示例和解释为什么
https://www.re-motion.org/blogs/mix/archive/2009/08/12/trying-to-resolve-a-method-in-a-closed-generic-type.aspx
你可以更仔细地思考一下。你不能不经思考就神奇地完成它。
1 2 3 4 5 6 7 8 9 10 11 12 13 | static void Main(string[] args) { PropertyInfo intHasValue = typeof (int?).GetProperty("HasValue"); PropertyInfo boolHasValue = ChangeGenericType(intHasValue, typeof (bool)); } public static PropertyInfo ChangeGenericType(PropertyInfo property, Type targetType) { Type constructed = property.DeclaringType; Type generic = constructed.GetGenericTypeDefinition(); Type targetConstructed = generic.MakeGenericType(new[] {targetType}); return targetConstructed.GetProperty(property.Name); } |
当然,这只适用于具有单个类型参数的泛型类型,但如果需要,可以将其概括为执行更多操作。
解决了它。但最大的问题是这是一种安全的方法吗?这里有什么我可能做错的地方吗?
1 2 3 4 5 6 7 8 9 10 11 12 | public static MethodInfo Convert(this MethodInfo method,params Type[] DeclaringTypeArguments) { var baseType = method.DeclaringType.GetGenericTypeDefinition().MakeGenericType(DeclaringTypeArguments); return MethodInfo.GetMethodFromHandle(method.MethodHandle, baseType.TypeHandle) as MethodInfo; } public static void Main(String[] args) { List<Type> list = new List<Type>(); Action<Type> action = list.Add; Console.WriteLine(action.Method.Convert(typeof(string))); Console.Read(); } |
你必须重新思考,因为方法是不同的。虽然hasValue的唯一区别是MethodInfo.DeclaringType,但Value属性中的区别是MethodInfo.ReturnType。