我正在做一些数据解析并遇到了这个问题。假设我们想将一些解析byte[]
为结构。我想将执行此操作的 C# 代码包装到静态方法中。
原始代码(我正在修改一段)阅读:
public class DiagnosticUndefined : BaseDiagnostic
{
StructDiagnosticUndefined bufferAllocation;
public DiagnosticUndefined(byte[] buff)
{
bufferAllocation = (StructDiagnosticUndefined)DiagnosticUtil.parseStruct(buff, typeof(StructDiagnosticUndefined));
}
}
我想为此使用通用函数,但如何进行?考虑:
public static class Util {
public static T Convert<T>(byte[] data) {...}
public static void Convert<T>(byte[] data, out T structure) {...}
}
第一个更符合正常过程,但缺点是编译器无法推断数据类型,因此我的调用将如下所示:
SomeStruct s;
s = Util.Convert<SomeStruct>(data);
另一种方法是:
SomeStruct s;
Util.Convert(data, out s);
我喜欢第二种方法,因为它将类型推断委托给编译器,即更少的运行时错误。另一方面,我倾向于避免使用 MSDN 支持的 out 参数:http: //msdn.microsoft.com/en-us/library/ms182131.aspx。我完全赞成“不要以复杂的方式解决简单问题”的范式,但这次我无法区分......
任何提示,意见?
更新
代码示例被简化了,变量实际上是一个成员,所以我不能“单行”。我还使用编组将数据转换为结构:
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
T output = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();