在动态对象上创建 运行 的方法列表
Create list of Methods to run on Dynamic Objects
所以假设我有一些已经为 class 定义的数字方法。
例如:
private int X(int a, int b)
{
return a + b;
}
private int Y(int a, int b)
{
return a - b;
}
private int Z(int a, int b)
{
return a * b;
}
现在,通过所有函数在 class 和 运行 主体中获取输入的标准方法显然是像这样调用每个函数:
public void processNormal(int a, int b)
{
//accumulate results
int acc = 0;
if (true)
{
//if want to add to current
acc += X(a, b);
acc += Y(a, b);
acc += Z(a, b);
}
else
{
//if want to replace current if larger
int k = X(a, b);
if (k > acc)
acc = k;
k = Y(a, b);
if (k > acc)
acc = k;
k = Z(a, b);
if (k > acc)
acc = k;
}
}
现在我很好奇,因为随着函数数量的增加,取决于您可能希望对函数结果执行多少操作,如果这不会变得有点麻烦的话。你可以创建一个你想要的函数的静态列表 运行,然后在 for 循环中使用它来缩短事情,我想它看起来像这样:
//List with all methods
List<Object> methods = new List<Object>();
//add all methods to list
public void processWithList(int a, int b)
{
//accumulate results
int acc = 0;
foreach (Object j in methods)
{
if (true)
{
//if want to add to current
acc += j(a, b);
}
else
{
//if want to replace current if larger
int k = j(a, b);
if (k > acc)
acc = k;
}
}
}
现在有了第二个过程,您仍然需要在某处定义列表,但我想随着事情的发展,更容易跟踪。所有函数都将采用相同的输入,并且 return 相同的对象,因此在这方面这不是问题。
我基本上想知道
A) 我愚蠢地把事情复杂化了,如果这样做有用的话。
B) 这样的东西在 C# 中会是什么样子?我可以在列表中使用预定义的 class 方法,还是必须在 class' 初始化中使用一堆委托函数生成列表?
感谢您的宝贵时间。
Am I stupidly over complicating things and if this would ever be a useful thing to do?
不,你做得很好。这是一种常见的方法。
What would such a thing look like in C#?
我认为与您的示例代码匹配的最简单选项是使用 List<Func<int, int, int>>
。
这是一个示例实现:
public class YourClass
{
private List<Func<int, int, int>> methods;
public yourClass()
{
methods = new List<Func<int, int, int>>()
{
(a,b) => X(a,b),
(a,b) => Y(a,b),
(a,b) => Z(a,b)
};
}
public int SumMethods(int a, int b)
{
var result = 0;
foreach(var m in methods)
{
result += m(a, b);
}
return result;
}
private int X(int a, int b) { throw new NotImplementedException(); }
private int Y(int a, int b) { throw new NotImplementedException(); }
private int Z(int a, int b) { throw new NotImplementedException(); }
}
所以假设我有一些已经为 class 定义的数字方法。
例如:
private int X(int a, int b)
{
return a + b;
}
private int Y(int a, int b)
{
return a - b;
}
private int Z(int a, int b)
{
return a * b;
}
现在,通过所有函数在 class 和 运行 主体中获取输入的标准方法显然是像这样调用每个函数:
public void processNormal(int a, int b)
{
//accumulate results
int acc = 0;
if (true)
{
//if want to add to current
acc += X(a, b);
acc += Y(a, b);
acc += Z(a, b);
}
else
{
//if want to replace current if larger
int k = X(a, b);
if (k > acc)
acc = k;
k = Y(a, b);
if (k > acc)
acc = k;
k = Z(a, b);
if (k > acc)
acc = k;
}
}
现在我很好奇,因为随着函数数量的增加,取决于您可能希望对函数结果执行多少操作,如果这不会变得有点麻烦的话。你可以创建一个你想要的函数的静态列表 运行,然后在 for 循环中使用它来缩短事情,我想它看起来像这样:
//List with all methods
List<Object> methods = new List<Object>();
//add all methods to list
public void processWithList(int a, int b)
{
//accumulate results
int acc = 0;
foreach (Object j in methods)
{
if (true)
{
//if want to add to current
acc += j(a, b);
}
else
{
//if want to replace current if larger
int k = j(a, b);
if (k > acc)
acc = k;
}
}
}
现在有了第二个过程,您仍然需要在某处定义列表,但我想随着事情的发展,更容易跟踪。所有函数都将采用相同的输入,并且 return 相同的对象,因此在这方面这不是问题。
我基本上想知道
A) 我愚蠢地把事情复杂化了,如果这样做有用的话。
B) 这样的东西在 C# 中会是什么样子?我可以在列表中使用预定义的 class 方法,还是必须在 class' 初始化中使用一堆委托函数生成列表?
感谢您的宝贵时间。
Am I stupidly over complicating things and if this would ever be a useful thing to do?
不,你做得很好。这是一种常见的方法。
What would such a thing look like in C#?
我认为与您的示例代码匹配的最简单选项是使用 List<Func<int, int, int>>
。
这是一个示例实现:
public class YourClass
{
private List<Func<int, int, int>> methods;
public yourClass()
{
methods = new List<Func<int, int, int>>()
{
(a,b) => X(a,b),
(a,b) => Y(a,b),
(a,b) => Z(a,b)
};
}
public int SumMethods(int a, int b)
{
var result = 0;
foreach(var m in methods)
{
result += m(a, b);
}
return result;
}
private int X(int a, int b) { throw new NotImplementedException(); }
private int Y(int a, int b) { throw new NotImplementedException(); }
private int Z(int a, int b) { throw new NotImplementedException(); }
}