从字符串调用方法作为继承的类

时间:2018-05-23 01:21:42

标签: c#

我面临的问题是我有一个用户输入一些对象的基本描述,然后他们指定计算的类型。可以将其视为具有乘法,加法,减法的能力。相同的数字输入,相同的数字输出。这些是类型的IEnumerable对象。所以他们在excel中输入数字,一个类抓住这些数字,我可以像inputedobject.firstnumber,inputedobject.secondnumber等那样使用它们。最后一个是inpytedobject.calculationType。我在想,因为我已经定义了calculateType,如果我可以接受并从该字符串调用该计算。 所以我有类似的东西:

var s = invokeMethod (inputedobject.calculationType, inputedobject)

它会产生calculationType (inputedobject)的结果,我会用它来做。 很高兴听到其他更好的实现。但是在这种方法中,我已经提到过我尝试过以下无效,因为它是在字符串上实现的,我不知道如何让它继承这些对象。

class InvokeString
    {
        public static IEnumerable<eTotal> InvokeStringMethod(string typeName, string methodName, LoanInput loanInput)
        {
            // Get the Type for the class
            Type calledType = Type.GetType(typeName);

            // Invoke the method itself. The string returned by the method winds up in s.
            // Note that stringParam is passed via the last parameter of InvokeMember,
            // as an array of Objects.
            IEnumerable<eTotal> s =  (string)calledType.InvokeMember(
                            methodName,
                            BindingFlags.InvokeMethod | BindingFlags.Public |
                                BindingFlags.Static,
                            null,
                            null,
                            new Object[] { loanInput } );

            // Return the string that was returned by the called method.
            return s;
        }

1 个答案:

答案 0 :(得分:1)

对我来说,你只需要将这些字符串映射到函数,这对于充满Func个对象的字典很容易。

首先将所有操作列在字典中,将键作为字符串,并将值设置为执行计算的委托。例如:

private Dictionary<string, Func<float,float,float>> _map = 
    new Dictionary<string, Func<float,float,float>>
{
    { "add",      (a,b) => a+b },
    { "subtract", (a,b) => a-b },
    { "multiply", (a,b) => a*b },
    { "divide",   (a,b) => a/b },
};

您可以使用调用者提供的字符串进行正确的操作,然后像常规函数一样使用该操作。例如:

public float Compute(float[] numbers, string opCode)
{
    var operation = _map[opCode];

    float accumulator = numbers[0];
    foreach (var n in numbers.Skip(1))
    {
        accumulator = operation(accumulator, n);    
    }
    return accumulator;
}

这是一个小测试程序,向您展示如何将它们放在一起:

public class Calculator
{
    private Dictionary<string, Func<float,float,float>> _map = new Dictionary<string, Func<float,float,float>>
    {
        { "add", (a,b) => a+b },
        { "subtract", (a,b) => a-b },
        { "multiply", (a,b) => a*b },
        { "divide", (a,b) => a/b },
    };

    public float Compute(float[] numbers, string opCode)
    {
        var operation = _map[opCode];

        float accumulator = numbers[0];
        foreach (var n in numbers.Skip(1))
        {
            accumulator = operation(accumulator, n);    
        }
        return accumulator;
    }
}

public class Program
{
    public static void Main()
    {
        var c = new Calculator();
        Console.WriteLine(c.Compute( new float[] { 2,2 }, "add"));
        Console.WriteLine(c.Compute( new float[] { 3,3 }, "multiply"));
        Console.WriteLine(c.Compute( new float[] {-2,2 }, "subtract"));
        Console.WriteLine(c.Compute( new float[] { 9,3 }, "divide"));
    }
}

输出:

4
9
-4
3

Click here to see the full code in action on DotNetFiddle