c# - 我想实现一个 linq 表达式,它允许我测试提供的对象上的属性
问题描述
我想从 MOQ 实现这个方法。(这里有点超出我的深度)
ISetup<T> Setup(Expression<Action<T>> expression);
public class Foo {
public string Bar { get; set; }
public int Baz { get; set; }
}
public class MyCoolClass
{
public ? Evaluate<Expression<Action>>(expression);
//I want to be able to access and test the value of Foo.Bar (see below)
}
public class ClientOfMyClass
{
public void UseTheMethod()
{
MyCoolClass myCool = new MyCoolClass();
bool result = myCool.Evaluate<Foo>(f => f.Bar);
}
}
基本上,我正在尝试编写一种方法,该方法允许调用者使用表达式指定对象的属性,并允许我测试该属性的值并对其进行处理。
解决方案
您想使用一个Expression<Func<>>
参数,并检查它是否包含 aBody
和 aMember
类型PropertyInfo
,并使用GetValue()
传递您的对象。
public static void Evaluate<TObj,TProp>(
this TObj obj,
Expression<Func<TObj, TProp>> expr)
{
var prop = (expr.Body as MemberExpression)?.Member as PropertyInfo;
var val = prop?.GetValue(obj);
if (val != null) {
//Do something
}
}
请注意,上面的代码需要传入的 lambda 指向一个属性。如果您想处理字段和方法,它们将作为不同类型的表达式出现,并且您需要稍微不同地处理它们。有关更多上下文和用法,这里有一个 Fiddle。
编辑:更新以与其他属性类型一起使用。
推荐阅读
- firebase - 这个 Firebase 设置自定义域在我的情况下如何工作
- python - 由于“PermissionError: [Errno 13] Permission denied:”,无法将项目添加到 csv 文件
- c# - 帕斯卡三角形 c#
- mongodb - Mongo批量更新输入的数组键值
- amp-html - AMP HTML | 链接下拉列表 - 多个链接/依赖项
- algorithm - 我们如何找到具有两个不同“ID”的图的最大连续区域?
- javascript - 电子:具有多种功能的按钮?
- r - 错误:$ 运算符对于没有 $ 的代码的原子向量无效?
- project-reactor - 如何调用 Sinks.Many
.tryEmitNext 来自多个线程? - django-rest-framework - Django Rest 框架面板 - 登录和注销不适用于 Simple JWT