使用反射调用 Cast 失败并出现参数计数不匹配异常
Use Reflection to call Cast fails with Parameter count mismatch exception
我有 Foo 类型的集合。
它绑定到 RadGridView 的 ItemsSource。
我想使用以下代码从 RadGridView 获取所有当前项目 -
var current_collection = gv.Items.Cast<Foo>().ToArray();
我想使用反射动态地执行上述操作,但是在实现时遇到了问题 运行,下面是我目前的代码 -
var t = gv.ItemsSource.GetType().GetGenericArguments().Single();
这里的t是Foo类型
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t).Invoke(gv.Items, null);
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t).Invoke(x, null);
上述代码出现参数计数不匹配异常。
您尝试调用的方法是 static,因此在使用 Invoke
时,您应该将 null
传递给 object obj
参数并通过 object[] parameters
argument:
传递所需的参数
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t)
.Invoke(null, new object [] { gv.Items });
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t)
.Invoke(null, new object[] { x });
这就是调用这些方法的方法
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t).Invoke(null, new object[] { gv.Items });
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t).Invoke(null, new object[] {x });
我有 Foo 类型的集合。 它绑定到 RadGridView 的 ItemsSource。 我想使用以下代码从 RadGridView 获取所有当前项目 -
var current_collection = gv.Items.Cast<Foo>().ToArray();
我想使用反射动态地执行上述操作,但是在实现时遇到了问题 运行,下面是我目前的代码 -
var t = gv.ItemsSource.GetType().GetGenericArguments().Single();
这里的t是Foo类型
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t).Invoke(gv.Items, null);
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t).Invoke(x, null);
上述代码出现参数计数不匹配异常。
您尝试调用的方法是 static,因此在使用 Invoke
时,您应该将 null
传递给 object obj
参数并通过 object[] parameters
argument:
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t)
.Invoke(null, new object [] { gv.Items });
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t)
.Invoke(null, new object[] { x });
这就是调用这些方法的方法
var x = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(t).Invoke(null, new object[] { gv.Items });
var y = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(t).Invoke(null, new object[] {x });