我正在构建一个普遍的现有代码中的类库,我收到一些编译器警告,我一生都无法弄清楚如何处理。
我有这样的代码:
void SomeMethod(Object data)
{
var size = Marshal.SizeOf(data);
...
}
代码构建,但在普遍的项目(我猜是 .NET 4.5.1 及更高版本的项目)我收到以下编译器警告:
警告 CS0618:“System.Runtime.InteropServices.Marshal.SizeOf(object)”已过时:“SizeOf(Object) 在未来版本中可能不可用。相反,请使用 SizeOf()。
但我如何创建一个替代品Marshal.SizeOf(Object)
在上述情况下使用通用无参数方法Marshal.SizeOf<T>()
?理论上,我可能不知道什么类型data
is?
是不是因为使用Marshal.SizeOf(Object)
被认为是不好的做法,已归因于Obsolete
?最重要的信息真的应该是“完全重构代码”吗?
好的,收到您的评论后,似乎您需要的一切都已经在那里:
SizeOf<T>(T) http://msdn.microsoft.com/en-us/library/vstudio/dn261467(v=vs.110).aspx:
我认为这是您需要的方法,但您不必显式定义通用参数,因为类型推断 http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/。你简单写var size = Marshal.SizeOf(myStructure);
编译器将从给定对象中提取类型并填写泛型参数。
SizeOf<T>() http://msdn.microsoft.com/en-us/library/vstudio/dn261466(v=vs.110).aspx:
当您自己的类可能已经是泛型类并且您有一个T
但没有使用的泛型类型的真实实例。在这种情况下,应选择此方法。
这种反射方法怎么样:
private static int MySizeOf(object structure)
{
var marshalType = typeof(Marshal);
var genericSizeOfMethod = marshalType.GetMethod("SizeOf", Type.EmptyTypes);
var sizeOfMethod = genericSizeOfMethod.MakeGenericMethod(structure.GetType());
var size = (int)sizeOfMethod.Invoke(null, null);
return size;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)