如何将Marshal.SizeOf(Object)替换为Marshal.Size Of<;T>;()

本文关键字:Marshal Of gt lt Size 替换 SizeOf Object | 更新日期: 2023-09-27 18:27:42

我正在用现有代码构建一个Universal类库,我收到了一些编译器警告,我终身都不知道该怎么办。

我有这样的代码:

void SomeMethod(Object data)
{
  var size = Marshal.SizeOf(data);
  ...
}

代码构建,但在Universal项目(我想还有.NET 4.5.1和更高版本的项目)中,我收到了以下编译器警告:

警告CS0618:"System.Runtime.InteropServices.Marshal.SizeOf(object)"已过时:"SizeOf(object)在未来版本中可能不可用。相反,请使用SizeOf<T>()。

但是,在上面的情况下,我如何使用通用的无参数方法Marshal.SizeOf<T>()来创建Marshal.SizeOf(Object)的替换?理论上,我可能不知道data是什么类型?

是因为使用Marshal.SizeOf(Object)被认为是不好的做法,所以它被归为Obsolete吗?带回家的信息真的应该是"完全重构代码"吗?

如何将Marshal.SizeOf(Object)替换为Marshal.Size Of<;T>;()

好吧,收到你的评论后,你需要的一切似乎都已经准备好了:

SizeOf<T>(T):我认为这是您需要的方法,但由于类型推断,您不必显式定义泛型参数。您只需编写var size = Marshal.SizeOf(myStructure);,编译器就会从给定对象中提取类型并填写泛型参数。

SizeOf<T>():当您自己的类可能已经是泛型类,并且您有一个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;
}