繁体   English   中英

通过反射和返回类型查找方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM