簡體   English   中英

C#:如何使用字符串變量的內容調用同名方法?

[英]C#: How can I use the content of a string variable to call a method with the same name?

SO上有很多答案,但我看不到 C# 的答案。

我當前的方法如下所示:

    private static decimal SelectOperation(decimal numDisplay, decimal numInput, string operation)
    {
        switch (operation)
        {
            case "":
                return (numInput == 0) ? numDisplay : numInput;
            case "Addition":
                return Operations.Addition(numDisplay, numInput);
            case "Subtraction":
                return Operations.Subtraction(numDisplay, numInput);
            case "Multiplication":
                return Operations.Multiplication(numDisplay, numInput);
            case "Division":
                return Operations.Division(numDisplay, numInput);
            case "Power":
                return Operations.Power(numDisplay, numInput);
            case "Modulus":
                return OperationsLibrary.Operations.Modulus(numDisplay, numInput);
            default:
                throw new NotImplementedException(operation);
        }
    }

有沒有辦法通過使用操作字符串作為方法調用的一部分來簡化這一點。 做這樣的事情:

    private static decimal SelectOperation(decimal numDisplay, decimal numInput, string operation)
    {
        if (operation == "") return (numInput == 0) ? numDisplay : numInput;

        try
        {
             return System.CallMethod($"Operations.{operation}(numDisplay, numInput)");
        }
        catch (Exception)
        {
            throw NotImplementedException(operation);
        }
    }

C# 是否有我剛剛編造的System.CallMethod()之類的方法? 還是有另一種方法來簡化我的代碼? 謝謝!

雖然您可以使用反射,正如另一個答案所提到的,雖然這完全符合您的問題,但您所展示的問題極不可能在任何生產應用程序中通過反射解決 - 因為反射非常昂貴,並且確實不提供任何類型安全- 請注意 arguments 通過反射method.Invoke傳遞給 function。Invoke 調用是一個object[] - 所以希望它們是正確的,但你只會在運行時知道。

在像您這樣的簡單情況下,更好的解決方案是Dictionary<string, Func<TNum1, TNum2, TResult>> ,可以像這樣配置:

static Dictionary<string, Func<decimal, decimal, decimal>> mathOperations =
    new Dictionary<string, Func<decimal, decimal, decimal>>()
    {
        ["Addition"] = (a, b) => a + b,
        ["Subtraction"] = (a, b) => a - b,
        ["Multiplication"] = (a, b) => a * b,
        ["Division"] = (a, b) => a / b,
        ["Power"] = (a, b) => (decimal)Math.Pow((double)a, (double)b),
        ["Modulus"] = (a, b) => a % b
    };

private static decimal SelectOperation(decimal a, decimal b, string operation)
{
    if (!mathOperations.TryGetValue(operation, out var mathFunc)) throw new NotImplementedException();
    return mathFunc(a, b);
}

現在, string比較和散列也有點昂貴,所以如果你可以引入一個定義數學運算的enum ,並且 map 將enum成員引入Dictionary中的Func ,那就更好了; 但想法是一樣的。

你可以使用反射來做到這一點

MethodInfo method = service.GetType().GetMethod(serviceAction);
object result = method.Invoke(service, new object[] { request });
return (R) result;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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