我面临的问题是我有一个用户输入一些对象的基本描述,然后他们指定计算的类型。可以将其视为具有乘法,加法,减法的能力。相同的数字输入,相同的数字输出。这些是类型的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;
}
答案 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