我只是想知道使用带有类型Type
的参数的函数(和更多参数)和只想要angle bracket
中的类型的泛型函数有什么区别?
Idea behinde:我想编写一个将ma文件系统上的类型保存为XML文件的函数。由于XmlSerializer需要具有要序列化的对象类型,我想知道:什么更好?
private bool SerializeIt(object o, Type t, string filePath)
{
bool result = false;
try
{
if (File.Exists(filePath))
File.Delete(filePath);
XmlSerializer serializer = new XmlSerializer(t);
using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
{
serializer.Serialize(fs, o);
}
result = true;
}
catch (Exception ex)
{
result = false;
Debug.WriteLine(ex);
}
return result;
}
private bool SerializeIt<T>(T o, string filePath)
{
bool result = false;
try
{
if (File.Exists(filePath))
File.Delete(filePath);
XmlSerializer serializer = new XmlSerializer(o.GetType());
using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
{
serializer.Serialize(fs, o);
}
}
catch (Exception ex)
{
result = false;
Debug.WriteLine(ex);
}
return result;
}
答案 0 :(得分:2)
您的第一种方法仅适用于SomeData1
类型,因为这是您指定的类型。另一种方法适用于通过T
传递的任何类型。
您可以使用o.GetType()
代替typeof(SomeData1)
来解决上述问题。尽管如此,第二种方法使您有机会使用基类作为序列化基础,这将清除派生类中的所有属性。
答案 1 :(得分:1)
在运行时评估函数private bool SerializeIt(object o, Type t, string filePath)
。
在编译时评估函数private bool SerializeIt<T>(T o, string filePath
的位置。那就是在IL代码中插入指定的类型。
答案 2 :(得分:1)
有很多不同之处。首先,您可以为通用参数创建约束,例如:
private bool SerializeIt<T>(T o, string filePath) where T: ISomething
其次 - 泛型类型的自由类型推断。
private bool SerializeIt<T>(T o, string filePath)
Something something = new Something();
o.SerializeIt(something, ""); // dont need to pass type (can infer from first argument).
第三 - 你在具体的强类型上工作,例如:
private bool SerializeIt<T>(T o, string filePath)
通常它使界面更简洁,更清洁。你不必使用松散类型的对象。