[英]Pass Method ( of void return type and with no input arguments) as parameter using C#
[英]Pass Method of Unknown Arguments/Return Type as Parameter in C#
這里有一個類似的問題:
假設您知道方法的參數和返回類型。 我想做一些不同的事情。 我正在尋找一個版本的System.Reflection的.GetMethod(字符串),而不是一個lambda函數 - 所以而不是:
MethodInfo methodInfo = typeof(MyClass).GetMethod("AddThing");
我可以使用更安全的編譯:
MethodInfo methodInfo = ReflectionHelper.GetMethod<MyClass>(mc => mc.AddThing);
因此,如果ReflectionHelper事先知道參數計數和返回類型,那么答案將是簡單的 - 例如,如果它沒有參數並返回字符串:
public static MethodInfo GetMethod<T, TReturn>(Expression<Func<T, Func<TArg, TReturn>>> expr)
{
return ((MethodCallExpression)expr.Body).Method;
}
除了事先我不知道參數計數/返回類型,我想避免僅用20次重載來發送垃圾信息,這些重載覆蓋了大多數但不是所有情況。
那么,我該怎么做?
您尚未在lambda mc => mc.AddThing
指定方法 - 您已指定方法組。
你可以做的是在表達式中編寫一個方法調用 - 雖然它永遠不會被執行,所以參數只需要指定你想要的重載。
所以,要使用它,你會寫:
MethodInfo mi = GetMethod<MyClass>( mc => mc.AddThing( null ) );
然后表達式可能只是一個Action
,而不是一個Func
:
public static MethodInfo<T>( Expression<Action<T>> expr )
{
return ( ( MethodCallExpression ) x.Body ).Method;
}
與表達式檢查一樣,如果lambda不是預期的形式,這很容易出現運行時錯誤,但它是朝着正確方向擺脫“魔術”字符串的一步。
我現在使用的解決方法,我稱之為“垃圾郵件方法”,在一組有限的場景中很難看但功能正常:
public class ReflectionHelper<T>
{
public MethodInfo GetMethod<TA1>(Expression<Func<T, Func<TA1>>> expr)
{
return ((MethodCallExpression)expr.Body).Method;
}
public MethodInfo GetMethod<TA1, TA2>(Expression<Func<T, Action<TA1, TA2>>> expr)
{
return ((MethodCallExpression)expr.Body).Method;
}
public MethodInfo GetMethod<TA1, TA2, TA3>(Expression<Func<T, Action<TA1, TA2, TA3>>> expr)
{
return ((MethodCallExpression)expr.Body).Method;
}
. . . // And more
}
接着,指定一長串具有各種參數計數的潛在動作和Func。 這讓我實際上可以使用它:
(new ReflectionHelper<MyClass>()).GetMethod<string>(mc => mc.SaySomething).Invoke("Hi");
所以它很接近 - 我只是按名稱調用方法,並且我確實避免傳遞假參數以便這樣做,但我仍然可以找到它的參數的類型 - 比我希望的更復雜對於。 在具有相同名稱的多個方法重載的情況下,傳遞參數類型會將方法列表縮小到一個特定的重載。
我仍然對一些更簡單的東西感興趣,但是我可以在我的問題中采用一種方法。 在方法過載情況下會很模糊,但標准.GetMethod(字符串)也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.