簡體   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