如何为扩展创建委托
本文关键字:创建 扩展 | 更新日期: 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);