2013-08-29 2 views
3

У меня есть некоторый код, как это:Как получить правильный тип T

Private Shared Function ReStoreFromXML(Of T)(ByVal TargetType As T, ByVal XMLpath As String) As List(Of T) 

     If Not TypeSupported(TargetType) Then Return Nothing 
.... 
     Return CType(mySerializer.Deserialize(fstream), List(Of T)) 

TargetType является, например, MyCustomType.

ТипПоддерживаемый должен проверить, нормально ли TargetType. Когда я пытаюсь что-то вроде

TargetType.GetType 

Или

GetType(T) 

я получаю только System.RuntimeType или System.Type. Как я могу исправить эту проблему?

UPD:

Для более четкого понимания того, что я хочу ... и в методе ReStoreFromXML у меня есть такой код:

Dim mySerializer As XmlSerializer 
mySerializer = New XmlSerializer(GetType(T)) 

Как я могу создать mySerializer с аргументом MyCustomType?

+0

Как вы называете свою функцию 'ReStoreFromXML'? Вы передаете экземпляр 'Type' в качестве первого аргумента? Если это так, это сделает 'T'' Type', * not * тип, который вы передаете. – hvd

+0

@hvd В этом проблема. Если вы вызываете 'ReStoreFromXML (GetType (string), ...)', то 'T' будет Type/RuntimeType. Если вы назовете 'ReStoreFromXML (« somestring », ...)', 'T' будет' string.' – sloth

+0

@Dominic Kexel thnx, вы комментируете даете мне правильный путь) – frankie

ответ

3

Я называю свою функцию таким образом viewsList = ReStoreFromXML (GetType (MyCustomType), XMLpath)

Это ваша проблема , Если вы вызываете ReStoreFromXML(GetType(string), ...), то T будет Type/RuntimeType. Если вы звоните ReStoreFromXML("somestring", ...), T будет string.

Так что просто удалите первый параметр, так как это необязательно, поскольку вы уже знаете тип, позвонив по номеру GetType(T).

Private Shared Function ReStoreFromXML(Of T)(XMLpath As String) As List(Of T) 
    Dim mySerializer = New XmlSerializer(GetType(T)) 
    ... 
End Function 

ReStoreFromXML(Of MyCustomType)(XMLpath) 
+0

Это не совсем то, что я хочу. Мне нужно, чтобы ReStoreFromXML работал с некоторыми типами, а не только с MyCustomType. Я создам свой код таким образом: viewsList = ReStoreFromXML (New MyCustomType, XMLpath) – frankie

+0

Я не вижу проблемы. 'ReStoreFromXML' по-прежнему является общим, поэтому можно просто вызвать' ReStoreFromXML (Of WhatEverTourIs) (XMLpath) '. – sloth

+0

О, теперь я понимаю. Thnx много! – frankie

1

Тип должен быть аргументом типа функции, а не аргументом этого типа. (Да, это сбивает с толку).

Таким образом, вы утверждаете тип дважды, поэтому разумный вызов будет:

ReStoreFromXML(Of String)("somestring", xmlPath) 

Где «SomeString» используется только для проверки, что это действительно строка, и это уже было сказано в (Of String) часть.

Вы должны изменить подпись метода для:

Private Shared Function ReStoreFromXML(Of T)(ByVal XMLpath As String) As List(Of T) 
    If Not TypeSupported(T) Then Return Nothing 
    ... 
End Function 
Смежные вопросы