如何为扩展创建委托

本文关键字:创建 扩展 | 更新日期: 2023-09-27 18:15:49

我想创建一个能够使用我在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;
    }

当然,"VectorExtension"并不是一个定义良好的类型。我试图创建一个消歧:

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

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

如何为扩展创建委托

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());

委托不需要知道或关心提供给它的方法是一个扩展方法。也不可能强制提供给它的方法为扩展方法。

在本质上,扩展方法只是另一种静态方法;据此行事:

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

然后你会这样称呼它:

myMatrix.Apply(VectorExtensions.SomeOperation);