使用 Expression.Call 创建矩阵<T>.Build.Dense()

Creating a Matrix<T>.Build.Dense() using Expression.Call

我想要 return 一个 Expression.Call 来创建一个密集的 MathNet 矩阵。

这是我想要的矩阵:

Matrix<ContentType>.Build.Dense(Rows,Columns)

ContentType 将为 intdoubleComplex

但我想使用 Expression.Call 创建它。 这是我当前的代码:

Expression.Call(
            typeof(Matrix<>)
                .MakeGenericType(ContentType)
                .GetProperty("Build")
                .GetMethod("Dense", new[] {typeof(int), typeof(int)}),
            Expression.Constant(Rows), Expression.Constant(Columns));

然而,这会导致构建错误:

[CS1955] Non-invocable member 'PropertyInfo.GetMethod' cannot be used like a method.

我做错了什么?

PropertyInfo类型上有GetMethod属性,returns属性getter 方法。您正在尝试将此 属性 用作方法(调用它)-因此出现编译器错误。相反,你应该这样做:

// first get Build static field (it's not a property by the way)
var buildProp = typeof(Matrix<>).MakeGenericType(ContentType)
               .GetField("Build", BindingFlags.Public | BindingFlags.Static);
// then get Dense method reference
var dense = typeof(MatrixBuilder<>).MakeGenericType(ContentType)
               .GetMethod("Dense", new[] { typeof(int), typeof(int) });
// now construct expression call
var call = Expression.Call(
               Expression.Field(null /* because static */, buildProp), 
               dense, 
               Expression.Constant(Rows), 
               Expression.Constant(Columns));