c# - 使用表达式时设置 T 的值
问题描述
我试图能够viewModel
根据需要在 a 中设置一个值。因此,让我先解释一下我要做什么,然后再回答我的问题。
我想在一个抽象类中有一个方法,它会有一个类似的签名。
SetValue<FooViewModel>(someClassToSetValueIn, viewModel, (vm)=> vm.Id);
所以我一直在研究这个,但是,我不明白为什么我在这里得到一个空值作为属性名称。
protected void SetValue<TSource, TResult>(PageableDropDownModel model, TSource viewModel,
Expression<Func<TSource, TResult>> property) where TSource:class
{
var viewModelProperty = viewModel.GetType().GetProperty(property.Name); //property.Name is null
model.SelectedValue = Convert.ToInt32(viewModelProperty?.GetValue(viewModel));
}
有人可以请为什么property.Name
是空的以及我如何让它工作。
解决方案
您所说property
的不是属性,而是表达式。
您的表达式在其主体中(vm) => vm.Id
包含 a ,而后者又具有 a ,而后者具有。MemberExpression
Member
Name
长话短说,您可以按如下方式提取属性名称:
protected void SetValue<TSource, TResult>(..., Expression<Func<TSource, TResult>> expression) ...
{
var propertyName = ((MemberExpression)expression.Body).Member.Name;
...
}
但请注意,当前版本的 C# 支持nameof
表达式,即您可以按如下方式简化代码:
protected void SetValue<TSource, TResult>(..., string propertyName) ...
{
...
}
并将其称为
SetValue<FooViewModel>(someClassToSetValueIn, viewModel, nameof(vm.Id));
推荐阅读
- google-cloud-platform - 文本有效负载中的自定义标签
- typescript - testCafe:在测试脚本中使用角色
- python - 从正则表达式匹配中获取某个组
- javascript - 如何在访问多维数组中的元素作为函数中传递的参数时使用点表示法?
- javascript - 以编程方式隐藏/显示离子晶圆厂按钮
- angular - 如何在Angular中动态更改模板?
- javascript - javascript中数组后的冒号
- jmeter - 如何生成事务控制器的动态序列号
- ruby-on-rails - Ruby On Rails 停止工作!!它不接受任何命令
- mysql - mysqldump 5.7.24 在 MacOS 上的 openssl 1.1 错误