使用 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 将为 int
、double
或 Complex
。
但我想使用 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));
我想要 return 一个 Expression.Call 来创建一个密集的 MathNet 矩阵。
这是我想要的矩阵:
Matrix<ContentType>.Build.Dense(Rows,Columns)
ContentType 将为 int
、double
或 Complex
。
但我想使用 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));