Вызывание родовой функции в VB.NET / C#

Вопрос: Я хочу вызвать родовую функцию, определенную как:

      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)()

Существует ли способ вызвать родовую функцию путем получения типа от экземпляра?

5
задан Stefan Steiger 2 June 2010 в 12:30
поделиться

5 ответов

Использование только методов пространства имен System.Reflection , что действительно не стоит тех усилий, которые вы пытаетесь сэкономить.

2
ответ дан 14 December 2019 в 01:02
поделиться

Обобщения и рефлексия очень плохие друзья. Однако вы можете сделать это с помощью 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
}
3
ответ дан 14 December 2019 в 01:02
поделиться

Тип универсального метода определяется во время компиляции, поэтому вы не можете установить его с помощью переменной. Это ключевое различие между универсальным программированием и отражением типов.

1
ответ дан 14 December 2019 в 01:02
поделиться

Мне кажется, что вы хотите создать более короткий псевдоним для вашего типа 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)()
2
ответ дан 14 December 2019 в 01:02
поделиться

[Это ответ на заданный вопрос, не обязательно решение вашей проблемы]

Чтобы избежать необходимости Of cConfiguration, вы можете включить игнорируемый ByVal Configuration As T в общий метод.

Тогда вы могли бы сказать

x = DeserializeFromXML(x)

Но ответ @DanTao, вероятно, лучше моего, если вы не найдете применения параметру Configuration.

0
ответ дан 14 December 2019 в 01:02
поделиться