Pergunta

Não tenho certeza de como descrever isso, mas estou tentando criar uma classe base que contenha uma função compartilhada (fábrica) chamada FromXML. Eu quero que essa função instancie um objeto do Tipo adequado e depois preencha -o através de um XMLDocument.

Por exemplo, digamos que eu tenho algo assim:

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

Eu gostaria de poder fazer algo assim:

Dim myObject As CustomObject = CustomObject.FromXml(source)

Isso é possível?

Foi útil?

Solução

Se você quiser contar uma função para fazer algo com um tipo específico, basta adicionar parâmetros genéricos a ele. Não tenho certeza se essa é a melhor maneira de realizar sua intenção original, mas fará o trabalho.

   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

Outras dicas

Primeiro, a função Fromxml deve saber o tipo de objeto necessário para criar e retornar. Para fazer isso, você poderia:

Passe o tipo em si como um parâmetro:

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

Use genéricos:

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

End Function

(Usando genéricos, você também pode especificar, por exemplo, "de t como xmlObject", para receber apenas uma classe atribuível ao xmlobject).

Em seguida, você terá que decidir como instanciar um novo objeto do tipo passado. Você pode investigar o tipo exato passado e criar uma nova instância de acordo (codificada) ou usar a reflexão para invocar um método construtor do tipo passado (assumindo que ele possui um construtor acessível) (ver exemplo aqui). Isso pode ser um pouco complicado, porque se t não tiver construtores vazios, você terá que investigar os argumentos dos construtores e invocar um delegado de correspondência (novamente, usando a reflexão).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top