2017-01-23 8 views
7

Ниже у меня есть решение получить атрибуты из полей с помощью метода расширения. Теперь я хочу сделать подобное с методами вместо полей.Доступ к атрибутам в методах с использованием метода расширения

public static MemberInfo GetMember<T, R>(this T instance, Expression<Func<T, R>> selector) 
{ 
    var member = selector.Body as MemberExpression; 
    return member?.Member; 
} 

public static T GetAttribute<T>(this MemberInfo meminfo) where T : Attribute 
{ 
    return meminfo.GetCustomAttributes(typeof(T)).FirstOrDefault() as T; 
} 

Использование:

var attr = this.GetMember(x => x.AddButtonVisibility).GetAttribute<Test>(); 

Так что в моем случае использование должно выглядеть примерно так:

var attr = this.GetMethod(x => x.SomeMethod).GetAttribute<Test>(); 

Возможно ли это каким-либо образом, или я должен попробовать что-то совершенно другое ?

+0

У вас возникли ошибки? Неясно, что вы просите. То же самое относится к MethodInfo – Nkosi

+0

@Nkosi Нет кода выше, но я хочу сделать то же самое с методами вместо полей. –

ответ

6

Вы можете сделать следующее:

public static MethodInfo GetMethod<T>(this T instance, Expression<Action<T>> selector) 
{ 
    var member = selector.Body as MethodCallExpression; 
    return member?.Method; 
} 

public static MethodInfo GetMethod<T, R>(this T instance, Expression<Func<T, R>> selector) 
{ 
    var member = selector.Body as MethodCallExpression; 
    return member?.Method; 
} 

Обратите внимание, что вам нужно обрабатывать void метод по-разному, потому что Func<T, R> не имеет никакого смысла, вам нужна перегрузка с Action<T>.

+0

Спасибо, что сработали! –

+0

@ ХансДаби, вы очень желанны! – InBetween