首页 > 解决方案 > 使用表达式时设置 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是空的以及我如何让它工作。

标签: c#

解决方案


您所说property的不是属性,而是表达式

您的表达式在其主体中(vm) => vm.Id包含 a ,而后者又具有 a ,而后者具有。MemberExpressionMemberName

长话短说,您可以按如下方式提取属性名称:

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));

推荐阅读