Como posso criar um construtor genérico? (isto é. Baseclass.Fromxml ()
-
21-09-2019 - |
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?
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).