表达式到select一个方法
Expression to select a method
我正在尝试根据 Dynamically calling Moq Setup() at runtime
使用反射动态配置 Moq
在示例中他们使用
var body = Expression.PropertyOrField( parameter, "ExampleProperty" );
在对象上创建 select 所需 属性 的表达式,然后使用该 selector.
构造 lambda 表达式
我想要我的 select 或 select 一个方法,例如我想动态构造以下内容:
mock.Setup(m => m.MyMethod()).Returns(1);
我试过使用:
var body = Expression.PropertyOrField(parameter, "MyMethod");
和
var body = Expression.MakeMemberAccess(parameter, typeof(T).GetMethod("MyMethod"));
但两者似乎都只适用于属性或字段,是否有不同的 select 或者我可以使用 select 方法来代替?
完整代码如下:
var mock = new Mock<T>();
var parameter = Expression.Parameter(typeof(T));
if (typeof(T).GetMethod("MyMethod") != null)
{
var body = Expression.PropertyOrField(parameter, "MyMethod");
var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
mock.Setup(lambdaExpression).Returns(0);
}
虽然我无法在此处访问 Moq
,但我 可以 向您展示如何构建调用方法的 lambda 表达式
private void DoIt<T>()
{
var mock = new Mock<T>();
var parameter = Expression.Parameter(typeof(T));
var methodInfo = typeof(T).GetMethod("MyMethod"); //Find the method "MyMethod" on type "T"
if (methodInfo != null)
{
var body = Expression.Call(parameter, methodInfo);
var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
//At this point, lambdaExpression is:
//Param_0 => Param_0.MyMethod()
mock.Setup(lambdaExpression).Returns(0);
}
}
class MyClass
{
public int MyMethod()
{
return 5;
}
}
请注意 typeof(T).GetMethod("MyMethod")
不是很具体。您可以使用大量重载(或利用 GetMethods
和过滤器),它们允许您按名称、return 类型和参数类型指定方法。
此外,请注意 Expression.Lambda<Func<T, int>>
仅适用于 return 和 int
没有参数的方法。根据谁负责确定方法,您可能也希望具有此可配置性。
我正在尝试根据 Dynamically calling Moq Setup() at runtime
使用反射动态配置 Moq在示例中他们使用
var body = Expression.PropertyOrField( parameter, "ExampleProperty" );
在对象上创建 select 所需 属性 的表达式,然后使用该 selector.
构造 lambda 表达式我想要我的 select 或 select 一个方法,例如我想动态构造以下内容:
mock.Setup(m => m.MyMethod()).Returns(1);
我试过使用:
var body = Expression.PropertyOrField(parameter, "MyMethod");
和
var body = Expression.MakeMemberAccess(parameter, typeof(T).GetMethod("MyMethod"));
但两者似乎都只适用于属性或字段,是否有不同的 select 或者我可以使用 select 方法来代替?
完整代码如下:
var mock = new Mock<T>();
var parameter = Expression.Parameter(typeof(T));
if (typeof(T).GetMethod("MyMethod") != null)
{
var body = Expression.PropertyOrField(parameter, "MyMethod");
var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
mock.Setup(lambdaExpression).Returns(0);
}
虽然我无法在此处访问 Moq
,但我 可以 向您展示如何构建调用方法的 lambda 表达式
private void DoIt<T>()
{
var mock = new Mock<T>();
var parameter = Expression.Parameter(typeof(T));
var methodInfo = typeof(T).GetMethod("MyMethod"); //Find the method "MyMethod" on type "T"
if (methodInfo != null)
{
var body = Expression.Call(parameter, methodInfo);
var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
//At this point, lambdaExpression is:
//Param_0 => Param_0.MyMethod()
mock.Setup(lambdaExpression).Returns(0);
}
}
class MyClass
{
public int MyMethod()
{
return 5;
}
}
请注意 typeof(T).GetMethod("MyMethod")
不是很具体。您可以使用大量重载(或利用 GetMethods
和过滤器),它们允许您按名称、return 类型和参数类型指定方法。
此外,请注意 Expression.Lambda<Func<T, int>>
仅适用于 return 和 int
没有参数的方法。根据谁负责确定方法,您可能也希望具有此可配置性。