gpt4 book ai didi

c# - 从 C# 类获取 JSON PropertyName,例如 "nameof(class.prop)"用于 json 属性?

转载 作者:太空宇宙 更新时间:2023-11-03 20:51:26 26 4
gpt4 key购买 nike

如何获取以下类和属性的 JSON PropertyName?类似于 JSON 属性的“nameof()”之类的东西?

也就是类似

var jsonName = GetJSONPropertyName(SampleClass.SampleClassID);//应该返回“jsoniD”

public class SampleClass
{
public SampleClass() { }
[JsonProperty(PropertyName = "jsoniD")]
public string SampleClassID { get; set; }
}

最佳答案

一个很好的问题是,如何以类型安全的方式传递属性。属性不是 .NET 中的一流对象。

其中一种方法是这样的:

using System.Linq.Expressions;

// ...

static string GetJsonPropertyName<TC, TP>(Expression<Func<TC, TP>> expr)
{
if (expr.Body is MemberExpression body)
return body.Member.GetCustomAttribute<JsonPropertyAttribute>()?.PropertyName;
else
throw new ArgumentException("expect field access lambda");
}

您需要像这样调用该函数:

var jsonName = GetJsonPropertyName<SampleClass, string>(x => x.SampleClassID);

是的,感觉不是很自然。对此感到抱歉。


感谢@elgonzo,代码可以这样简化:

static string GetJsonPropertyName<TC>(Expression<Func<TC, object>> expr)
{
// in case the property type is a value type, the expression contains
// an outer Convert, so we need to remove it
var body = (expr.Body is UnaryExpression unary) ? unary.Operand : expr.Body;

if (body is System.Linq.Expressions.MemberExpression memberEx)
return memberEx.Member.GetCustomAttribute<JsonPropertyAttribute>()?.PropertyName;
else
throw new ArgumentException("expect field access lambda");
}

var jsonName = GetJsonPropertyName<SampleClass>(x => x.SampleClassID);

关于c# - 从 C# 类获取 JSON PropertyName,例如 "nameof(class.prop)"用于 json 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54774643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com