Как я могу получить доступ к параметру метода из связанного атрибута? - PullRequest
0 голосов
/ 19 марта 2009

Учитывая следующие классы, как я могу перехватить значение Class1.SampleMethod из SampleAttribute? Спасибо

Public Class Class1
    <SampleAttribute()> _
    Public Function SampleMethod(ByVal Value As Integer) As Boolean
        Return True
    End Function
End Class

<AttributeUsage(AttributeTargets.Method)> _
Public Class SampleAttribute
    Inherits System.Attribute

    Private _Value As Integer

    Property Value() As Integer
        Get
            Return _Value
        End Get
        Set(ByVal value As Integer)
            _Value = value
        End Set
    End Property

    Public Sub New()

    End Sub
End Class

EDIT:

Учитывая ответ Эндрю Хэра, возможно, я пытаюсь использовать неправильную конструкцию. У меня есть длинный список похожих методов, и мне нужно выполнять набор операций каждый раз, когда вызывается один из них. Я думал, что прикрепление атрибута к каждому из них будет самым простым решением. Любое предложение?

Ответы [ 2 ]

1 голос
/ 20 марта 2009

Если вы пытаетесь смоделировать межсекторальное поведение (несвязанные объекты должны делать похожие / одинаковые вещи), тогда AOP - это путь. Я использовал PostSharp для отличного эффекта, как компиляции, так и ткачества во время выполнения. Он будет в основном вставлять код во время компиляции (или выполнения) в скомпилированные сборки, которые будут вызывать ваши методы на основе вашего определения.

Обновление
RE: PostSharp: На codeplex есть десятки хороших руководств. Вам нужно будет создать новый атрибут, который наследуется от PostSharp.Laos.OnMethodBoundaryAspect. Переопределение методов этого базового класса сообщит посткомпилятору, какой код вставлять во время компиляции. Этот пример трассировки на codeplex должен показать вам все, что вам нужно сделать.
EndUpdate

Другой архитектурный шаблон, на который вы, возможно, захотите взглянуть, это Наблюдатель (например, Быстрый Google нашел эту статью MSDN) .

Если эти методы на самом деле являются объектным поведением в некоторых связанных классах, тогда наблюдатель может быть уведомлен об активности, а затем ответить соответствующим образом. Недостаток такого шаблона публикации-подписки заключается в том, что вам необходимо зарегистрировать свой список иждивенцев у наблюдателя. Если у вас есть несколько методов для классов, тогда эта концепция все еще остается верной, но не обязательно идеальной.

Конечно, подход бедного мужчины / женщины состоит в том, чтобы просто добавить строку кода в конце всех методов; -)

0 голосов
/ 19 марта 2009

Edit:

Похоже, вы пытаетесь что-то сделать с помощью AOP . Возможно, что-то вроде PostSharp было бы полезно - это позволило бы вам делать то, что вы хотите с помощью атрибутов.


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

Imports System
Imports System.Reflection

Class Program
    Private Shared Sub Main()
        Dim type As Type = GetType(Class1)
        Dim members As MemberInfo() = type.GetMembers()

        For Each member As MemberInfo In members
            Dim attributes As Object() = member.GetCustomAttributes(GetType(SampleAttribute), True)

            If attributes.Length > 0 Then
                ' this means that the current "member"
                ' has your custom attribute
            End If
        Next
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...