c# - 使用表达式时设置 T 的值

标签 c#

我试图在 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/

相关文章:

c# - Geometry.Combine 在相交的几何对象上给出奇怪的结果

c# - 同时使用 TCP 和 UDP 套接字

c# - 在 .NET 中使用正则表达式提取 URL

c# - 在 headless 单元测试中运行时,如何使 WebBrowser 完成导航?

c# - 在循环中动态更改 C# 变量名称

c# - RadListView ItemCommand 未触发

c# - Asp.Net Global.asax获取当前请求的Page对象

c# - Hangfire:延迟调用方法不起作用

c# - 如何为模板控件创建自定义属性

c# - 从 .NET 通过电子邮件地址搜索 AD 用户的正确方法