泛型问题.我只是不了解如何制作通用方法

Mat*_*att 1 c# generics

我有一些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视为具体类型的占位符.这里的关键是要理解之间的差异Footypeof(Foo)(或者说有点不同,类型,如Foo与实例System.Type一样typeof(Foo)).