我试图在 viewModel
中设置一个值根据需要。因此,在回答我的问题之前,让我先解释一下我想要做什么。
我希望在抽象类中有一个具有类似签名的方法。
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
是 null 以及我如何让它工作。
最佳答案
您所说的属性
不是属性,而是一个表达式。
您的表达式 (vm) => vm.Id
在其主体中包含一个 MemberExpression
,而该表达式又具有一个 Member
,它有一个名称
。
长话短说,您可以按如下方式提取属性名称:
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));
关于c# - 使用表达式时设置 T 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53519692/