2014-10-20 4 views
0

Извините за мой английский Miserables.Generic T from string in C#

У меня есть 2 значения из файла XML, и мне это нужно для общего метода, далее приводят к возвращаемому значению Т. В одном значении XML этого типа, но как я могу использовать это как Тип?

пример:

var dataType = xml.Element("type").Value; 
var modelList = await Mapper<dataType>(serviceXml, myNamespace, objType, serviceJson.ToString()); 
+0

Вы можете получить 'Type' из строки с использованием' Type.GetType() ', но я не думаю, что есть какой-либо способ использовать его как параметр * *, поскольку это должно быть известно при компиляции -время. Имеет ли 'Mapper()' перегрузка, которая принимает параметр метода типа 'Type' вместо? (Или может это?) – David

+0

Большинство картографов могут получать тип в качестве параметра, где вы можете использовать метод .GetType() – Amorphis

+0

@David ... не верно, вы можете использовать отражение для создания общего вызова, например: http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method –

ответ

0

Вы можете использовать статический GetType метод, который принимает строку и возвращает тип, если он может быть найден

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]") 

Если тип, представленный строкой не может быть найден , он вернется null

После получения типа вы можете использовать Mapper через отражение: если Mapper - это метод, используйте следующие

MethodInfo method = this.GetType().GetMethod("Mapper"); // this.GetType works if you aren't in a static method 
MethodInfo generic = method.MakeGenericMethod(Type.GetType("theXmlValue")); 
generic.Invoke(this, new object[] {/* your parameters to the Mapper method */}); 
+0

, но ... картограф должен предоставить метод с параметром 'Type' (не общим) –

+1

@AndreasNiedermair. Затем картографу необходимо будет вызвать отражение, создав класс generic, который будет нуждаться в типе в любом случае , – samy

+0

?? ... вы должны усилить свой ответ, указав на то, что вы идете на не-общую перегрузку или используете отражение, чтобы сделать общий вызов. в настоящее время этот ответ - всего лишь половина пути ...btw я не downvoter;) –

0

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

var method = Mapper.GetType().GetMethod("DoesEntityExist") 
         .MakeGenericMethod(new Type[] { dataType }); 
method.Invoke(this, new object[] { serviceXml, myNamespace, objType, serviceJson.ToString() }); 

Что вы могли бы сделать, это создать интерфейс, или базовый класс и создать метод расширения для управления преобразованием.

1

тип 1) Нагрузка с Type.GetType

2) Использование отражения для создания общего Mapper, т.е. TypeOf (Mapper <>). CreateGenericType (DATATYPE)

3) Использование Activator.CreateInstance для создания экземпляра generic Mapper