gpt4 book ai didi

c# - 获取属性的 JsonPropertyAttribute

转载 作者:行者123 更新时间:2023-12-03 20:31:15 26 4
gpt4 key购买 nike

我找到了一个帖子,对我遇到的问题有很好的答案,但我似乎找不到我正在寻找的小细节。

public class myModel
{
[JsonProperty(PropertyName = "id")]
public long ID { get; set; }
[JsonProperty(PropertyName = "some_string")]
public string SomeString {get; set;}
}

我需要一个返回 JsonProperty 的方法 PropertyName的特定属性。也许我可以通过的地方 TypeProperty我需要,如果找到,该方法将返回该值。

这是我找到的方法,它使我朝着正确的方向前进(我相信) taken from here
using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
...

public static string GetFields(Type modelType)
{
return string.Join(",",
modelType.GetProperties()
.Select(p => p.GetCustomAttribute<JsonPropertyAttribute>()
.Where(jp => jp != null)
.Select(jp => jp.PropertyName));
}

目标是调用这样的函数(任何修改都可以)
string field = GetField(myModel, myModel.ID);

更新 #1

我把上面的修改成了这个,但是我不知道如何得到 ID的字符串来自 myModel.ID .
public static string GetFields(Type modelType, string field) {
return string.Join(",",
modelType.GetProperties()
.Where(p => p.Name == field)
.Select(p => p.GetCustomAttribute<JsonPropertyAttribute>())
.Where(jp => jp != null)
.Select(jp => jp.PropertyName)
);
}

我要 防止 实际属性名称的硬编码字符串。例如我 不要想调用上述方法为:
string field = GetField(myModel, "ID");

我宁愿使用类似的东西
string field = GetField(myModel, myModel.ID.PropertyName);

但我不完全确定如何正确地做到这一点。

谢谢!

最佳答案

这是一种在保持强类型的同时做到这一点的方法:

public static string GetPropertyAttribute<TType>(Expression<Func<TType, object>> property)
{
var memberExpression = property.Body as MemberExpression;
if(memberExpression == null)
throw new ArgumentException("Expression must be a property");

return memberExpression.Member
.GetCustomAttribute<JsonPropertyAttribute>()
.PropertyName;
}

并这样称呼它:
var result = GetPropertyAttribute<myModel>(t => t.SomeString);

你可以让它更通用一点,例如:
public static TAttribute GetPropertyAttribute<TType, TAttribute>(Expression<Func<TType, object>> property)
where TAttribute : Attribute
{
var memberExpression = property.Body as MemberExpression;
if(memberExpression == null)
throw new ArgumentException("Expression must be a property");

return memberExpression.Member
.GetCustomAttribute<TAttribute>();
}

现在因为属性是通用的,你需要移动 PropertyName外呼:
var attribute = GetPropertyAttribute<myModel, JsonPropertyAttribute>(t => t.SomeString);
var result = attribute.PropertyName;

关于c# - 获取属性的 JsonPropertyAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45826000/

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