如何为扩展程序创建委托?

时间:2013-05-29 14:30:57

标签: c#

我想创建一个方法,它能够使用我在Vector类(MathNet)上创建的几个扩展。例如,我有Vector扩展名:

public static bool IsNaN(this  Vector<double> m)
    {
        int i = Array.IndexOf(m.ToArray(), double.NaN);
        bool b = (i == -1);
        b = !b;
        return b;
    }

我希望能够使用此扩展作为参数。例如,我想写一些类似的东西:

         public static Vector<double> ApplyExtension(this Matrix<double> x, VectorExtension myOperation)
    {
        Vector<double> res = new DenseVector(x.ColumnCount, 0);
        for (int i = 0; i < x.ColumnCount; i++)
        {
            res[i] = x.Row(i).myOperation();
        }
        return res;
    }

当然,&#34; VectorExtension&#34;不是一个明确定义的类型。我试图创建一个删除:

public delegate double VectorExtension(this Vector<double> d);

但是,它不起作用。有人能帮助我吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

public static Vector<TResult> ApplyExtension<T, TResult>(this Matrix<T> x, Func<Vector<T>, TResult> myOperation)
{
   var res = new DenseVector(x.ColumnCount, 0);
   for (int i = 0; i < x.ColumnCount; i++)
   {
       res[i] = myOperation(x.Row(i));
   }
   return res;
}

现在您可以使用方法组语法

matrix.ApplyExtension(VectorExtensions.IsNaN);

或将cal包装成另一个lambda

matrix.ApplyExtension(vector => vector.IsNaN());

答案 1 :(得分:0)

代表不需要知道或关心提供给它的方法是扩展方法。您无法强制提供给它的方法作为扩展方法。

扩展方法在引擎盖下只是另一种静态方法;相应地说:

public static Vector<double> Apply(this Matrix<double> x
    , Func<Vector<double>, double> myOperation)
{ }

然后你可以这样称呼它:

myMatrix.Apply(VectorExtensions.SomeOperation);