簡體   English   中英

在C#中傳遞未知參數/返回類型作為參數的方法

[英]Pass Method of Unknown Arguments/Return Type as Parameter in C#

這里有一個類似的問題:

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM