当实例ID尚不知道时,在非静态成员函数上正确使用委托

时间:2012-08-14 23:33:55

标签: c# delegates

我试图以一种我从未在各种书中描述的方式使用代表。

我的问题是:

是否可以通过这种方式使用代理?

如果是这样,我应该如何更改代码才能使用代理?

具体来说,我想要一个函数从两个可能的函数中选择另一个函数。

class Profile
{
   private List<verticalCurve> allVCs;
   // create allVCs in the constructor

   private double nonTrivialFunctionToFindTheRightVCin_allVCs
                      (double lengthAlong, getSwitchForProfile aDel)
   { // about thirty lines of code which I want to reuse }


   public double getElevation(double distanceAlongPfl)
   {
         // compiler error on the following line:
      getSwitchForProfile myDelEL = 
            new verticalCurve.getSwitchForProfile(verticalCurve.getElevation);

      return nonTrivialFunctionToFindTheRightVCin_allVCs
                 (distanceAlongPfl, myDelEL);
   }

   public double getSlope(double distanceAlongPfl)
   {
         // compiler error on the following line:
      getSwitchForProfile myDelSL = 
            new verticalCurve.getSwitchForProfile(verticalCurve.getSlope);

      return nonTrivialFunctionToFindTheRightVCin_allVCs
                 (distanceAlongPfl, myDelSL);
   }

}  // end class Profile

class verticalCurve
{
   private double elevation;
   private double slope;

   static internal delegate double getSwitchForProfiles(double distanceAlongPfl);

   public double getElevation(double distanceAlong)
   { computeElevation then return elevation; }

   public slope getSlope(double distanceAlong)
   { compute slope then return slope;}
}  // end class verticalCurve

编译器错误状态

非静态字段,方法或属性'Profile.verticalCurve.getElevation(distanceAlong)'

需要对象引用

看来我的问题是,当我向委托分配一个方法时,我还不知道它将被调用哪个verticalCurve实例。但我不能使verticalCurve.getElevation静态,因为它必须知道它所在的verticalCurve。

很抱歉对这些问题进行了长时间的设置。我确实试图简化它,但在这一点上似乎不可简化。

提前感谢您的帮助。

  • Paul Schrum

1 个答案:

答案 0 :(得分:5)

听起来你想要创建一个委托,它将对象作为参数调用它:

delegate double DistanceFunction(VerticalCurve curve, double distance);

void SomeFunction(DistanceFunction func) {
    double result = func(someCurve, 42);
}

SomeFunction((c, dist) => c.GetSlope(dist));