在我的ToString()覆盖中,我正在做一些大致如下的事情:

public class MyObject
{
    public string Prop1 { get; set; } = "value1";
    public string Prop2 { get; set; } = "value2";

    public override string ToString()
    {
        var parts = new[]
        {
            $"{nameof(Prop1)}={Prop1}",
            $"{nameof(Prop2)}={Prop2}",
        };
        return string.Join(",", parts);
    }
}

与其一遍又一遍地重复相同的"name=value"操作,有没有可能有一个函数可以计算出该props 的名称(例如Prop1)和值?

例如,我可以这样做吗:

public override string ToString()
{
    var parts = new[]
    {
        GetProp(x => x.Prop1), // returns "Prop1=value1"
        GetProp(x => x.Prop2), // returns "Prop2=value2"
        // ...
    };
    return string.Join(",", parts);
}

我想我需要一个类似于此的函数,但我不确定用于获取成员名称的实现:

private string GetProp(Expression<Func<MyObject, object>> exp)
{
    var name = ""; // <---- How to get the name?
    var value = exp.Compile().Invoke(this);
    return $"{name}={value}";
}

如果我判断exp,我可以看到成员名称确实存储在exp.Body.Member.Name下,但我不知道如何访问它.

enter image description here

推荐答案

你所需要做的就是将身体的温度设定为MemberExpression,如下所示:

    private string GetProp(Expression<Func<MyObject, object>> exp)
    {
            var name = ""; // <---- How to get the name?
            if (exp.Body is MemberExpression memberExpression)
            {
                name = memberExpression.Member.Name;
            }
            else if (exp.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression unaryMemberExpression)
            {
                name = unaryMemberExpression.Member.Name;
            }

            var value = exp.Compile().Invoke(this);
            return $"{name}={value}";
    }

Fiddle

添加了Edit:个UnaryExpression判断.

Csharp相关问答推荐

EF Core. Income和. AsNoTracking正确用法

为什么总输出就像12.3没有一分一样?

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

.NET 8 Web-API返回空列表

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

如何在页面重新加载后保持菜单切换状态

如何从ASP.NET核心MVC视图和Blazor传递数据

Blazorise折线图仅绘制数据集的一部分

异步实体框架核心查询引发InvalidOperation异常

在不添加不必要的尾随零的情况下本地化浮点型?

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

N层解决方案上的依赖注入-删除样板

如何将端点(或с匹配请求并判断其路径)添加到BCL?

在平行内使用跨度.用于循环

将列表转换为带有逗号分隔字符串形式的值的字典

.NET EF Core Automapper项目到筛选不起作用

最小API定义的Swagger标头参数

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

我想我必须手动使用res1(字符串形式的PowerShell哈希表)