Вопрос: Я хочу вызвать родовую функцию, определенную как:
Public Shared Function DeserializeFromXML(Of T)(Optional ByRef strFileNameAndPath As String = Nothing) As T
Теперь, когда я называю его, я хотел сделать это с любым из вариантов ниже:
Dim x As New XMLserialization.cConfiguration
x = XMLserialization.XMLserializeLDAPconfig.DeserializeFromXML(Of x)()
x = XMLserialization.XMLserializeLDAPconfig.DeserializeFromXML(GetType(x))()
x = XMLserialization.XMLserializeLDAPconfig.DeserializeFromXML(Of GetType(x))()
Но это не работает. Я нахожу это очень раздражающей и нечитабельной необходимостью ввести
x = XMLserialization.XMLserializeLDAPconfig.DeserializeFromXML(Of XMLserialization.cConfiguration)()
Существует ли способ вызвать родовую функцию путем получения типа от экземпляра?
Использование только методов пространства имен System.Reflection
, что действительно не стоит тех усилий, которые вы пытаетесь сэкономить.
Обобщения и рефлексия очень плохие друзья. Однако вы можете сделать это с помощью MakeGenericMethod . Однако это будет сложно и некрасиво.
Поскольку XmlSerializer
основан на экземпляре Type
, я бы все наоборот: имел настоящий код Type
и вызов что из неглубокой родовой версии; пример на C #:
public T DeserializeFromXML<T>(string path) {
return (T)DeserializeFromXML(typeof(T), path);
}
public object DeserializeFromXML(Type type, string path) {
//TODO: real code
}
Тип универсального метода определяется во время компиляции, поэтому вы не можете установить его с помощью переменной. Это ключевое различие между универсальным программированием и отражением типов.
Мне кажется, что вы хотите создать более короткий псевдоним для вашего типа XMLserialization.cConfiguration
. Попробуйте использовать оператор Imports
для этого:
' at the top of the file
Imports C = XMLserialization.cConfiguration
' somewhere in the body of the file
Dim x = XMLserialization.XMLserializeLDAPconfig.DeserializeFromXML(Of C)()
[Это ответ на заданный вопрос, не обязательно решение вашей проблемы]
Чтобы избежать необходимости Of cConfiguration
, вы можете включить игнорируемый ByVal Configuration As T
в общий метод.
Тогда вы могли бы сказать
x = DeserializeFromXML(x)
Но ответ @DanTao, вероятно, лучше моего, если вы не найдете применения параметру Configuration
.