如何用 Marshal.SizeOf() 替换 Marshal.SizeOf(Object)?

2024-04-14

我正在构建一个普遍的现有代码中的类库,我收到一些编译器警告,我一生都无法弄清楚如何处理。

我有这样的代码:

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(使用前将#替换为@)

如何用 Marshal.SizeOf() 替换 Marshal.SizeOf(Object)? 的相关文章

随机推荐