Определите, является ли экземпляр MethodInfo средством доступа к свойству - PullRequest
11 голосов
/ 19 октября 2011

Я пишу прокси для декорирования, используя Castle DynamicProxy .Мне нужен перехватчик прокси для перехвата только записи свойств (не чтения), поэтому я проверяю название метода таким образом:

public void Intercept(IInvocation invocation)
{
    if (invocation.Method.Name.StartsWith("set_")
    {
        // ...
    }

    invocation.Proceed();
}

Теперь это работает нормально, но мне не нравится тот факт, что мой прокси имеет интимныйзнание того, как реализованы свойства: я хотел бы заменить проверку имени метода чем-то вроде:

if (invocation.Method.IsPropertySetAccessor)

К сожалению, мой Google-фу подвел меня.Есть идеи?

Ответы [ 6 ]

16 голосов
/ 19 октября 2011

Вы можете проверить, существует ли свойство, для которого этот метод является установщиком (не проверено):

bool isSetAccessor = invocation.Method.DeclaringType.GetProperties() 
        .Any(prop => prop.GetSetMethod() == invocation.Method)

(Вдохновение взято из Марк отвечает на связанный вопрос .)

5 голосов
/ 19 октября 2011

Нет вуду, о котором я знаю.Вы могли бы , возможно, лишить set_, найти свойство с таким именем и сравнить экземпляр MethodInfo (invocation.Method) со средством доступа к свойству (GetSetMethod()) - однако яне могу честно сказать (без проверки), получите ли вы тот же экземпляр MethodInfo (даже если он равен тем же методом).

if(method.IsSpecialName && method.Name.StartsWith("set_"))
{
    var prop = typeof (Foo).GetProperty(method.Name.Substring(4),
           BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
    var accessor = prop.GetSetMethod();
    bool isSame = accessor == method;
}
3 голосов
/ 19 октября 2011

Я не уверен, какой тип используется для вызова. Метод, но если вы можете получить PropertyInfo, вы можете использовать IsSpecialName . К сожалению, это говорит не только о том, является ли свойство set_ или _get, но и о том, является ли оно перегруженным оператором.

0 голосов
/ 19 октября 2011

из вашего MethodInfo объекта получает свойство MemberType , в котором должно быть указано, что это тип свойства , поэтому вы сможете преобразовать его в PropertyInfo вместо.этот объект предоставляет свойство CanWrite , которое сообщает, является ли это установщиком.

0 голосов
/ 19 октября 2011

Сначала вы можете проверить свойство MemberType класса MethodInfo, чтобы узнать, является ли оно Property.

Теперь вы должны попытаться угадать, является ли это получение или набор. Если вы не хотите анализировать имя (кто-то может назвать метод "set_Something"), вы можете проверить аргументы.

  • Если средство доступа к свойствам принимает один параметр и возвращает void, это набор
  • Если средство доступа к свойству возвращает одно значение и не выбирает параметры, это get

Вас может заинтересовать только первая проверка

0 голосов
/ 19 октября 2011

Я думаю, вы можете попробовать использовать методы расширения: http://msdn.microsoft.com/en-us/library/bb383977.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...