Можно программировать процедурно на большинстве языков OO, но питание OO прибывает из способности наследовать, инкапсулировать и абстрагировать ту процедурную логику. Я думаю, что Вы корректны, библиотека должна много походить на класс. Это должно иметь свой собственный объем и инкапсулировать логику позади функций с понятными именами.
Логика синтаксического анализа выражения может потребовать некоторой работы. Вместо того, чтобы иметь дело с фактическими типами, вы конвертируете в строки.
Вот набор методов расширения, которые вы можете использовать вместо этого. Первый получает имя участника. Второй / третий объединяются, чтобы проверить, есть ли атрибут у члена. 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;
}
}
Надеюсь, это поможет вам.