Как я могу создать универсальный конструктор? (т.е. BaseClass.FromXml (<param>) - PullRequest
1 голос
/ 19 марта 2010

Я не знаю, как это описать, но я пытаюсь создать базовый класс, который содержит общую (фабричную) функцию с именем FromXml. Я хочу, чтобы эта функция создала экземпляр объекта правильного типа и затем заполнила его через XmlDocument.

Например, скажем, у меня есть что-то вроде этого:

Public Class XmlObject
    Public Shared Function FromXml(ByVal source as XmlDocument) As XmlObject
        // <need code to create SPECIFIC TYPE of object and return it
    End Function
End Class

Public Class CustomObject
    Inherits XmlObject
End Class

Я бы хотел иметь возможность сделать что-то вроде этого:

Dim myObject As CustomObject = CustomObject.FromXml(source)

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 19 марта 2010

Во-первых, функция FromXml должна знать тип объекта, который необходимо создать и вернуть. Для этого вы можете либо:

Передайте сам тип в качестве параметра:

Public Shared Function FromXml(ByVal source As XmlDocument, _
                               ByVal resultType As Type) As XmlObject
End Function

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

Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As XmlObject

End Function

(Используя Generics, вы также можете указать, например, «Of T as XmlObject», чтобы получать только в T класс, присваиваемый XmlObject).

Далее вам нужно будет решить, как создать новый объект переданного типа. Вы можете либо исследовать точный переданный тип и соответственно создать новый экземпляр (жестко запрограммированный), либо использовать Reflection для вызова метода конструктора переданного типа (при условии, что он имеет доступный конструктор) (см. пример здесь ). Это может оказаться немного сложным, потому что если T не имеет пустых конструкторов, вам придется исследовать аргументы конструкторов и вызывать делегат matchin (опять же, используя Reflection).

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

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

   Public Class XmlObject
      Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As T
         Dim result As T = Activator.CreateInstance(GetType(T))

         Return result
      End Function
   End Class
...