Я ищу способ добавления реализации интерфейса к классу во время выполнения. Вот пример кода, который я расскажу ниже.Как добавить интерфейсы к классу программно (во время выполнения)
Public Interface IAction
Sub DoThis(a As Integer)
End Interface
Class Actor
Implements IAction
Private mNumber As Integer
Public Sub New(number As Integer)
mNumber = number
End Sub
Public Sub DoThis(a As Integer) Implements IAction.DoThis
Console.WriteLine(String.Format("Actor #{0}: {1}", mNumber, a))
End Sub
End Class
Class ActionDispatcher
Implements IAction
Private Shared mActionList As New List(Of IAction)
Public Shared Sub Add(actor As IAction)
mActionList.Add(actor)
End Sub
Public Sub DoThis(a As Integer) Implements IAction.DoThis
For Each act In mActionList
act.DoThis(a)
Next
End Sub
End Class
Module Module1
Sub Main()
Dim a As New ActionDispatcher
ActionDispatcher.Add(New Actor(1))
ActionDispatcher.Add(New Actor(2))
a.DoThis(5)
End Sub
End Module
Это связано с WCF, где один должен предоставить CreateHost единственный класс, который реализует все интерфейсы, необходимые для конечных точек. В этом случае ActionDispatcher является таким классом, и IAction является одним из многих интерфейсов, которые должны быть реализованы.
Мое видение заключается в том, чтобы не выполнять IAction в ActionDispatcher вручную, но иметь какой-то механизм регистрации, где я могу сказать, что ActionDispatcher должен реализовывать интерфейсы IAction, IDoing, INoAction и т. Д. - и для меня созданы методы диспетчеризации.
MSDN говорит, что любой класс совместим с любым интерфейсом, поэтому мне не нужно объявлять «Реализует» в ActionDispatcher. Но мне все еще нужно реализовать интерфейс и подключить метод реализации к определению интерфейса, поэтому WCF может найти его при необходимости.
Ближайшая вещь, которую я нашел, вероятно, Automatic Interface Implementer, но она (1) создает новый тип, (2) добавляет фиктивные методы.
Я также попытался понять класс CodeCompileUnit, но до сих пор не видел отношения к тому, что мне нужно.
Может ли кто-нибудь более опытный в Reflection API помочь мне? Есть ли хороший способ сделать то, что я хочу?
Я прохожу через это упражнение. Я предполагаю, что мне больше всего хотелось бы не общаться с IL (что само собой разумеется, как ассемблер, а также с большей склонностью к ошибкам), но генерировать IL-код из строки :-) Что-то вроде
Compiler.CompileToIL("Public Sub DoThat(a As Integer) Implements ... End Sub")
– MikNik