如何用 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)? 的相关文章

  • 检测 PowerShell 开关

    我正在用 C 开发 PowerShell cmdlet 并且有 true false switch 语句 我注意到 如果我希望 bool 为 true 我需要指定 SwitchName true 否则我会得到 Missing an argu
  • 为什么 GetThreadTimes 返回

    我试图测量线程中花费的时间以用于进度报告目的 但我从 GetThreadTimes 系统调用中得到非常奇怪的结果 给出以下程序 在 VS 2013 中编译 针对 NET 4 5 using System using System Diagn
  • 抛出并保留堆栈跟踪不符合代码分析所描述的预期

    进行代码分析给了我项目 CA2200 CA2200 重新抛出以保留堆栈详细信息 func 重新抛出捕获的异常并将其显式指定为参数 请改用不带参数的 throw 以保留最初引发异常的堆栈位置 我已经实现了该建议 但无论如何我似乎都得到了相同的
  • 如何订阅 C++/CX 中 Windows 运行时组件内引发的事件?

    我在 Windows 运行时组件 用 C 编写 中有一个引发事件的类 我无法弄清楚如何在引用该组件的 C CX 应用程序中订阅这些事件 C 代码 在 Windows 运行时组件中 public sealed class Messenger
  • 使用什么 API 在现有 MFC 应用程序中添加 HTTP 客户端支持?

    我最近接到一项任务 要添加与以下内容交互的能力网络地图服务 http en wikipedia org wiki Web Map Service到现有的 MFC 应用程序 我需要客户端 HTTP API 根据我的研究 领先的候选人似乎是CA
  • 使用加法求阶乘

    我正在尝试创建一个 C 代码来查找整数的阶乘 以便我可以将代码转换为汇编语言 我的代码似乎将第二个整数 乘 两次 即 5 4 4 3 我似乎无法找出原因 请帮助 define N 5 int main int j 0 int i 0 int
  • GetWindowText() 抛出错误并且没有被 try/catch 捕获

    当我为 GetWindowText 运行下面的代码时 我收到作为内部异常抛出的以下错误 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 DllImport user32 dll EntryPoint GetWindowTextLeng
  • 对于多重继承,使用隐式转换而不是 QueryInterface() 是否合法?

    假设我有一个类实现两个或多个 COM 接口 正如here https stackoverflow com questions 1742848 why exactly do i need an explicit upcast when imp
  • 如何将大文件 (>1 GB) 的编码转换为 Windows 1252,而不出现内存不足异常?

    考虑 public static void ConvertFileToUnicode1252 string filePath Encoding srcEncoding try StreamReader fileStream new Stre
  • 输出字段值相同的记录

    该主题可能会重复 我在不同的场景下询问这个话题 https stackoverflow com questions 64150691 select records which the values of the field are the
  • 为什么 new String("Hello") 在 C# 中无效?

    制作背后的逻辑 原因是什么 String s new String Hello World 在 C 中非法 错误是 string String char 的最佳重载方法匹配有一些无效参数 我对 API 文档不感兴趣 我感兴趣的是为什么这是非
  • 如何唤醒正在休眠的线程?

    我在加载事件中创建了一个线程 如下所示 Thread checkAlert null bool isStop false private void frmMain Load object sender EventArgs e checkAl
  • 如何使这些 std::function 参数明确?

    传递 lambda 时 以下函数重载是不明确的 我发现std function can be 由大多数可调用类型构造 https stackoverflow com a 22543082 1079110 即使他们的签名不匹配 所以编译器无法
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 如何在C#中从XML读取键值

    我有下面的 xml 格式文件 名为 ResourceData xml
  • IEnumerable 的随机顺序

    我有一个 IEnumerable 集合如下 var result1 GetResult1 Returns 2 4 5 6 我必须处理元素并以随机方式创建另一个集合 结果应如下 var result2 GetResult2 result1 R
  • C++ 中什么被视为语句?

    我的教授通常会问我的班级给定程序中有多少条语句 但我无法确定他将什么定义为语句 似乎 if else 是一个语句 而 for 循环也是一个语句 无论其中是否还有其他假设的语句 对于这个问题是否有任何管理规则或者他对自己的发明的定义 Than
  • 不在焦点时响应键盘? (C#、Vista)

    我正在尝试编写一个应用程序 只要按下 Shift 键 无论当前哪个应用程序具有焦点 它都会做出响应 我尝试过这个SetWindowsHookEx 与GetKeyboardState 但这两种方法仅在应用程序窗口具有焦点时才有效 我需要它在全
  • jQuery Datatable:分页和过滤器显示不正确

    我不知道如何解决这个问题 尝试了一整天但没有成功修复分页 我正在使用 jQuery 数据表 并且为了显示我的大量数据 我正在使用服务器端 作为测试 仅调用表中的 10 行数据 然后在传递到表之前 我重组了里面的数据dataSrc 使用这个解
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu

随机推荐