我有一些XML,存储在一个表中.我知道反序列化应该是什么对象,但我有很多类型的对象.
所以,我有这个代码,它可以工作,但它非常特定于1种类型的对象.我想让它通用以接受许多类型的对象之一.
Type _type = typeof(ReynoldsRCI.Services.rey_SvcApptView)
XmlSerializer ser = new XmlSerializer(_type);
object sck;
using (StringReader reader = new StringReader(_msg.RawText))
{
using (XmlTextReader xreader = new XmlTextReader(reader))
{
sck = ser.Deserialize(xreader);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我喜欢的是一个1行方法调用,我将它传递给对象和文本的类型,它将反序列化它并将其返回给调用者以供使用.但是对于泛型来说,我完全是个白痴,所以我所拥有的代码甚至都没有编译.
public T DoStuff<T>(T _type, string RawText)
{
// Doesn't like this line. Error "The best overloaded method match for 'System.Xml.Serialization.XmlSerializer.XmlSerializer(System.Type)' has some invalid arguments"
XmlSerializer ser = new XmlSerializer(_type);
object retObj;
using (StringReader reader = new StringReader(RawText))
{
using (XmlTextReader xreader = new XmlTextReader(reader))
{
retObj = ser.Deserialize(xreader);
}
}
// Doesn't like this line, either "The type or namespace name '_type' could not be found"
return (_type)retObj;
}
Run Code Online (Sandbox Code Playgroud)
当涉及到泛型时,我显然缺少一些基本的东西,而且我无法将它拼凑在一起.有人可以用快速指针帮助我吗?
jas*_*son 13
要获得类型T,你需要说typeof(T).在你的方法结束时,要演绎retObj到一个实例T,你必须说(T)retObj.因此
public T DoStuff<T>(string RawText) {
XmlSerializer ser = new XmlSerializer(typeof(T));
// details elided
return (T)retObj;
}
Run Code Online (Sandbox Code Playgroud)
问题的关键是,T正在发挥作用int,或者string,或者Foo还是别的什么东西.也就是说,它是一个类型的名称,而不是一个实例System.Type.因此,您可以像使用其他类型的名称一样使用它.所以
new XmlSerializer(typeof(T));
Run Code Online (Sandbox Code Playgroud)
类似于
new XmlSerializer(typeof(Foo));
Run Code Online (Sandbox Code Playgroud)
和
return (T)retObj;
Run Code Online (Sandbox Code Playgroud)
类似于
return (Foo)retObj;
Run Code Online (Sandbox Code Playgroud)
可以将其T视为具体类型的占位符.这里的关键是要理解之间的差异Foo和typeof(Foo)(或者说有点不同,类型,如Foo与实例System.Type一样typeof(Foo)).