Получить тип, используя отражение для подачи в общий класс - PullRequest
3 голосов
/ 23 февраля 2012

Как я могу получить имя / тип класса, используя строку имени класса?как

Dictionary<string, string> DFields = GetFields();

тип

Dictionary<string, string>
object = Deserialize<?>(_stream)

В идеале я думал:

object = Deserialize<"Dictionary<string, string>">(_stream)

Это должно стать

object = Deserialize<Dictionary<string, string>>(_stream) 

вчтобы работать.Я сериализую как 10 объектов, но у меня есть только имена типов в строковом формате.Мне нужно отформатировать строковый формат для фактического типа, чтобы я мог передать его в универсальную функцию десериализатора сериализатора.

1 Ответ

3 голосов
/ 23 февраля 2012

Шаг 1 - Получить экземпляр типа:

Необходимо использовать полное имя сборки, переданное в Type.GetType().При быстром тестировании путем вызова GetType().AssemblyQualifiedName для экземпляра типа Dictionary () получается:

System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Version= 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089]], mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken= b77a5c561934e089

довольно беспорядок.Я считаю, что вы можете удалить большую часть из этого, хотя и он все еще будет работать:

System.Collections.Generic.Dictionary`2 [[System.String, mscorlib], [System.String, mscorlib]], mscorlib

для этого:

var typeName = "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib";
var type = Type.GetType( typeName );

Шаг 2 (предполагая, что API вызывает универсальный параметр, который является дерьмом IMO) - Используйте отражение для параметризации универсального метода динамически:

var genericMethod = typeof(Serialzier).GetMethod( "Deserializer" );
var parametizedMethod = genericMethod.MakeGenericMethod( type );
var parameters = new object[] { _stream };
var deserializedInstance = parametizedMethod.Invoke( null, parameters );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...