gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:00:50 28 4
gpt4 key购买 nike

我正在从现有代码构建一个通用类库,但我收到了一些编译器警告,提示我终其一生都不知道该如何处理。

我有这样的代码:

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

代码生成,但在 Universal 项目(我猜是 .NET 4.5.1 和更高版本的项目)中,我收到以下编译器警告:

warning CS0618: 'System.Runtime.InteropServices.Marshal.SizeOf(object)' is obsolete: 'SizeOf(Object) may be unavailable in future releases. Instead, use SizeOf<T>().

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

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

最佳答案

好的,在收到您的评论后,似乎您需要的一切都已经存在:

SizeOf<T>(T) :我认为这是您需要的方法,但由于 type inference,您不必显式定义通用参数.你简单写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;
}

<罢工>

关于c# - 如何用 Marshal.SizeOf<T>() 替换 Marshal.SizeOf(Object)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com