私はいくつかのデータ解析を行っており、この問題に遭遇しました。一部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);
2 番目のアプローチは、型推論をコンパイラに委譲するため、実行時エラーが少ないので気に入っています。一方、MSDN でサポートされている out パラメータの使用を避ける傾向があります: http://msdn.microsoft.com/en-us/library/ms182131.aspx。私は「複雑な方法で単純な問題を解決しない」パラダイムに大賛成ですが、今回は区別できません...
ヒント、意見はありますか?
アップデート
コード例は簡略化されており、変数は実際にはメンバーであるため、「1 行」にすることはできません。また、マーシャリングを使用してデータを構造に変換しています。
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
T output = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();