通过反射和返回类型

时间:2016-06-30 13:40:42

标签: c# asp.net rest reflection

在使用反射工作之后,设法从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

由于

1 个答案:

答案 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 ;