Получить JSON PropertyName из C # Class, например, "nameof (class.prop)" для свойств json? - PullRequest
0 голосов
/ 19 февраля 2019

Как я могу получить JSON PropertyName следующего класса и Property?Что-то вроде «nameof ()», эквивалентного для свойств JSON?

, то есть что-то вроде

var jsonName = GetJSONPropertyName(SampleClass.SampleClassID); //should return "jsoniD"

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Работает Значение-Тип Поддержка выражений на основе решения @ Влада (с шаблоном UnaryExpression, поднятым с this SO POST )

public static string GetJsonPropertyName<T>(Expression<Func<T, object>> expr)
{
    if (((expr.Body as UnaryExpression)?.Operand ?? expr.Body) is MemberExpression body)
        return body.Member.GetCustomAttribute<JsonPropertyAttribute>()?.PropertyName;
    else
        throw new ArgumentException("expect field access lambda");
}
0 голосов
/ 20 февраля 2019

Хороший вопрос: как передать свойство безопасным для типа способом?Свойства не являются объектами первого класса в .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...