[英]Finding method through reflection and return type
在进行了一些思考之后,设法从GetMethods中获取了一些数据,我终于碰壁了。 我试图找到关于此的任何资料,但无济于事。
基本上,我正在ASP.NET(MVC webapi)中创建RESTFUL Api,并使用反射来查找包含数百个视图/存储过程的DataComponent类的正确方法。 我已经克服了基本的障碍,但是现在当我终于尝试使用参数来查找特定的SQL视图时,我似乎遇到了错误:
找到不明确的匹配项。
我假设这是因为我正在尝试通过查找单个方法
MethodInfo theMethod = myType.GetMethod(toCheck);
但是结果是两种不同的方法 。
根据我的经理的说法,这是由于我们使用了两个不同的视图,它们返回两种不同的DataType(一个是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.Object”的对象转换为类型为“ 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));
引发错误
System.Type的未知方法GetMethods(string,System.Reflection.BindingFlags)
和
mi => mi.ReturnType == typeof(DataSet));
引发此错误:
变量mi的未知类型
谢谢
对于后续问题,您需要创建一个正在调用该方法的特定类型的对象。 对于具有默认(无参数)构造函数的类型,可以执行以下操作:
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 ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.