[英]Difference between generic function and function with Type parameter
我只是想知道使用带有Type
参数(和更多参数)的函数与只需要angle bracket
的类型的泛型函数之间有什么区别?
背后的想法:我想编写一个函数来将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;
}
您的第一种方法仅适用于SomeData1
类型,因为这是您指定的类型。 另一种方法适用于通过T
传递的任何类型。
您可以使用o.GetType()
而不是typeof(SomeData1)
解决上述问题。 尽管如此,第二种方法仍使您有机会使用基类作为序列化基类,这将清除派生类中的所有属性。
函数private bool SerializeIt(object o, Type t, string filePath)
在运行时评估。 其中,函数private bool SerializeIt<T>(T o, string filePath
在编译时评估private bool SerializeIt<T>(T o, string filePath
。即在IL代码中插入指定的类型。
有很多差异。 首先,您可以为通用参数创建约束,例如:
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)
通常,它使界面更简单,更清洁。 您不必使用松散类型的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.