使用dynamic对象创建泛型类实例时触发RuntimeBinderException异常求助
问题排查与解决
异常原因
触发的RuntimeBinderException核心问题是**MethodInfo.Invoke的参数类型不匹配**:Invoke的第二个参数要求传入object[]类型(用来承载目标方法的所有参数),但你直接传了单个dynamic类型的obj。由于obj是动态类型,编译器无法在编译阶段做类型校验,运行时动态绑定找不到匹配的Invoke重载,因此抛出异常。
修复方案
把obj包装成object[]数组传入Invoke即可;如果需要接收方法返回值,可将Invoke的结果强转为对应类型(这里是int)。
修正后的完整代码
using System; using System.Dynamic; public class Program { public static void Main() { dynamic obj = new ExpandoObject(); obj.num = 1; obj.str = "a"; Type t = obj.GetType(); Type myType = typeof(RulesService<>).MakeGenericType(t); object instance = Activator.CreateInstance(myType, 999); // 将obj包装为object[]数组传入Invoke int result = (int)myType.GetMethod("GetMatchingRules") .Invoke(instance, new object[] { obj }); Console.WriteLine($"方法返回值: {result}"); } } public class RulesService<T> { private readonly int _retNum = 0; public RulesService(int retNum) { _retNum = retNum; } public int GetMatchingRules(T objectToMatch) { Console.WriteLine("GetMatchingRules"); return _retNum; } }
额外说明
如果目标方法有多个参数,只需把所有参数按顺序放入object[]数组即可,比如new object[] { param1, param2, param3 }。
内容的提问来源于stack exchange,提问作者Lena Brenner
相关产品推荐
相关产品推荐

