在使用反射工作之后,设法从GetMethods获取一些数据后,我终于碰到了一堵墙。我试图在此找到任何消息来源,但无济于事。
基本上我在ASP.NET(MVC webapi)中创建RESTFUL Api并使用反射来查找包含数百个视图/存储过程的DataComponent类的正确方法。我已经克服了基本障碍,但现在当我终于尝试使用参数查找特定的SQL视图时,我似乎遇到了错误:
找到了模糊的匹配。
我假设这是因为我试图通过
找到一种方法MethodInfo theMethod = myType.GetMethod(toCheck);
但结果是两种不同的方法。
根据我的经理的说法,由于我们使用两个不同的视图返回两个不同的DataTypes(一个是DataReader,另一个是DataSet)。
我想问的是什么 HIVEMIND 是如何通过手动检查生成的返回类型是DataSet还是以其他任何方式将这两个结果缩小到单个结果?
跟进问题:
我似乎无法将结果放在DataSet中,因为.Invoke方法需要 Object 。我试图将返回设置为Object,然后将对象转换为DataSet ......
Type myType = (typeof(myClass));
MethodInfo[] arrayToCheck = myType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Object result = new Object();
foreach (MethodInfo mi in arrayToCheck)
{
if (mi.Name.Equals(param) && mi.ReturnType == typeof(DataSet))
{
result = mi.Invoke(mi, arr);
}
}
DataSet ds = (DataSet)result; // Error here
附加信息:无法转换类型&System;对象' 输入' System.Data.DataSet'。
问题延续:
尝试实施答案提供的解决方案
String[] arr = {"", conStr, ""};
var myType = (typeof(JaberoDC.JaberoDC.JaberoDC));
var method = myType.GetMethods(param, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly).Single(mi => mi.ReturnType == typeof(DataSet));
var subject = Activator.CreateInstance(myType);
var result = method.Invoke(subject, arr);
DataSet ds = (DataSet)result;
但是,它似乎没有按预期工作。
该行
var method = myType.GetMethods (param, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) .Single(mi => mi.ReturnType == typeof(DataSet));
引发错误
未知方法GetMethods(string,System.Reflection.BindingFlags) System.Type的
并且
mi => mi.ReturnType == typeof(DataSet));
引发此错误:
未知类型的变量mi
由于
答案 0 :(得分:1)
对于您的后续问题,您需要创建一个您正在调用该方法的特定类型的对象。对于具有默认(无参数)构造函数的类型,您可以执行以下操作:
Object result = Activator.CreateInstance(myType);
所以你的整体代码看起来像这样:
var myType = typeof(myClass);
var method = myType
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Single(mi => mi.Name == param && mi.ReturnType == typeof(DataSet));
var subject = Activator.CreateInstance(myType);
var result = method.Invoke(subject, arr);
Dataset ds = (DataSet)result ;