如何用Marshal.SizeOf <t>()替换Marshal.SizeOf(Object)?</t>

时间:2014-10-24 20:16:38

标签: c# portable-class-library win-universal-app obsolete

我正在从现有代码构建一个通用类库,并且我得到了一些编译器警告,我终其无法弄清楚该怎么做。

我有这样的代码:

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

代码构建,但是在 Universal 项目中(我猜,.NET 4.5.1及更高版本的项目)我得到以下编译器警告:

  

警告CS0618:&#39; System.Runtime.InteropServices.Marshal.SizeOf(object)&#39;已废弃:&lt; SizeOf(Object)在将来的版本中可能不可用。相反,请使用SizeOf&lt; T&gt;()。

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

是否因为使用Marshal.SizeOf(Object)被视为不良做法而被归为Obsolete?带回家的消息应该是&#34;完全重构代码&#34;?

1 个答案:

答案 0 :(得分:0)

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

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;
}

<击>