Получите пользовательские атрибуты от выражения свойства лямбды

Можно программировать процедурно на большинстве языков OO, но питание OO прибывает из способности наследовать, инкапсулировать и абстрагировать ту процедурную логику. Я думаю, что Вы корректны, библиотека должна много походить на класс. Это должно иметь свой собственный объем и инкапсулировать логику позади функций с понятными именами.

20
задан Bernd 13 October 2009 в 12:06
поделиться

1 ответ

Логика синтаксического анализа выражения может потребовать некоторой работы. Вместо того, чтобы иметь дело с фактическими типами, вы конвертируете в строки.

Вот набор методов расширения, которые вы можете использовать вместо этого. Первый получает имя участника. Второй / третий объединяются, чтобы проверить, есть ли атрибут у члена. GetAttribute вернет запрошенный атрибут или значение null, а IsRequired просто проверяет наличие этого конкретного атрибута.

public static class ExpressionHelpers
{
    public static string MemberName<T, V>(this Expression<Func<T, V>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        return memberExpression.Member.Name;
    }

    public static T GetAttribute<T>(this ICustomAttributeProvider provider) 
        where T : Attribute
    {
        var attributes = provider.GetCustomAttributes(typeof(T), true);
        return attributes.Length > 0 ? attributes[0] as T : null;
    }

    public static bool IsRequired<T, V>(this Expression<Func<T, V>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        return memberExpression.Member.GetAttribute<RequiredAttribute>() != null;
    }
}

Надеюсь, это поможет вам.

45
ответ дан 29 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: