如何在对象集合中的单个变量上使用函数

Thi*_*ser 1 c# reflection function

我正在寻找一种方法将函数应用于对象集合,每个对象同时具有多个变量,以便我可以将函数应用于集合中的每个对象并选择我想要应用的变量到。例如:上课

point{
   int x;
   int y;
   int z;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我希望将函数“展平”应用于这些点的列表,以便其中一个变量变为 0。

扁平化可能是这样的:

   flatten<variableName>(List<Point> points){
          foreach(var point in points){
             point.<variableName> = 0;
          }
   }
Run Code Online (Sandbox Code Playgroud)

有谁知道这是否可以用 c# 实现,也许使用某种反射之类的结构?我知道它可以在 Javascript 中完成,我希望在 c# 中完成,因为它可以防止大量重复代码(请注意,我想使用它的实际函数要大得多,并且包含多个子函数)。

Sea*_*ean 6

既然你的模拟代码希望有人传递一个变量名,为什么不只传递一个 lambda:

void Flatten(List<Point> points, Action<Point> action)
{
  foreach(var point in points)
  {
    action(point);
  }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以说:

Flatten(points, point => point.x = 0);
Run Code Online (Sandbox Code Playgroud)

如果你想设置多个值然后传递一个表达式块:

Flatten(points, point =>
{
  point.x = 0;
  point.y = 0;
});
Run Code Online (Sandbox Code Playgroud)

如果您对使用其他序列List(例如 HashSet)感兴趣,则只需更改Flatten为使用IEnumerable

void Flatten(IEnumerable<Point> points, Action<Point> action)
{
  foreach(var point in points)
  {
    action(point);
  }
}
Run Code Online (Sandbox Code Playgroud)