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