让我们用一堆假设开始这个线程:
第一个假设:我们有一个库(* .dll),其中包含以下代码:
class Program {
static void Main(string[] args) {
XmlSerializer ser = new XmlSerializer(typeof(Foo));
}
}
public class Foo { public string name;}
第二个假设:我们得到了一个源自Foo的课程,我们称之为Bar。
public class Bar : Foo { }
此课程位于图书馆外。
现在有了神奇之处:Bar-class是通过Reflection加载的,所以我们不知道它在编译时是否存在。此外,XmlSerializer
不知道派生类的任何内容,因为我们在一个完全不同的库中,我们不能简单地在此处添加XmlInclude
,因为我们无法更改Foo
- 类的代码。那么有没有办法在XmlSerializer
- 类的实例上使用现有的Bar
(我知道当前的实现ser
根本不可见任何外部代码,但是让我们把它放在一边,并假设我们可以从Bar
- 类中访问序列化器?
这可以通过在类的定义前面使用Bar
- 类([System.Xml.Serialization ...])的属性来实现吗?
答案 0 :(得分:0)
假设 wierd 原因存在这些限制,并且您的XmlSerializer需要一个类型参数,那么您需要获取参数的运行时类型。
var barInstance = However().You().Reflect().To().Get().Bar();
// The runtime type
var barType = barInstance.GetType();
var ser = XmlSerializer(barType);
typeof(T)在编译时获取类型,但由于您无法访问该类型,因此您需要Obj.GetType();