5

汎用のWriteList(List value)関数を使用して、BinaryWriterを使用してリストを作成したいと思います。これが私が使用しているコードです:

public void WriteList<T>(List<T> value)
{
    for (int i = 0; i < value.Count; i++)
    {
        _writer.Write(value[i]);
    }
}

私が受け取っているエラーは次のとおりです。

 Error  1   The best overloaded method match for 'System.IO.BinaryWriter.Write(bool)' has some invalid arguments    
Error   2   Argument 1: cannot convert from 'T' to 'bool'   

BinaryFormatterは絶対にオプションではありません。

4

3 に答える 3

6

BinaryFormatterを避けることはできないと思います。タイプTは任意の複合タイプであり、Tの各インスタンスはメモリ上の変数の巨大なグラフを表すことができるためです。

したがって、あなたが持っている唯一の解決策は、Tのインスタンスをbyte []形式に変換することであり、そのための最も簡単な解決策は、BinaryFormatterです。

実際、.Write()メソッドがプリミティブ型のみを受け入れる理由は、プリミティブ型を直接byte []に​​変換する方法(Convert.ToXXX()を使用)を知っているためですが、汎用型Tの場合は推測できません。

回避策として、次のようなインターフェイスを定義できます。

public interface IBinarySerializable
{
    byte[] GetBytes();
}

次に、それをクラスに実装します。

public class MyClass: IBinarySerializable
{
    public int X {get;set;}
    public byte[] GetBytes()
    {
        return BitConverter.GetBytes(X); // and anyother
    }
}

メソッドを次のように変更します。

public void WriteList<T>(List<T> value) where T:IBinarySerializable
{
    for (int i = 0; i < value.Count; i++)
    {
        _writer.Write(value[i].GetBytes());
    }
}
于 2011-07-20T22:35:25.860 に答える
4

BinaryWriterのドキュメントを確認すると、オブジェクトの引数を受け入れないことがわかります(プリミティブ型を書き込みます)。コンパイラはオーバーロードで最善を尽くして失敗します。これは、Tをboolにキャストできないためです。またはBinarwWriterが望む他のもの。

オブジェクトをBinaryWriterが動作するものに変換する必要があります。

于 2011-07-20T22:31:51.930 に答える
4

ジェネリックTをBinaryWriter.Writeに渡すことはできません-多くの特定のタイプ(bool、byte、byte []、int、stringなど)のオーバーロードがありますが、ジェネリックタイプはありません。したがって、以下のコードと同様の方法で、自分で行う必要があります。

    public void WriteList<T>(List<T> value)
    {
        for (int i = 0; i < value.Count; i++)
        {
            switch (Type.GetTypeCode(typeof(T))){
            //_writer.Write(value[i]);
                case TypeCode.Boolean:
                    _writer.Write((bool)(object)value[i]);
                    break;
                case TypeCode.Byte:
                    _writer.Write((byte)(object)value[i]);
                    break;
                case TypeCode.Char:
                    _writer.Write((char)(object)value[i]);
                    break;
                case TypeCode.Decimal:
                    _writer.Write((decimal)(object)value[i]);
                    break;
                case TypeCode.Double:
                    _writer.Write((double)(object)value[i]);
                    break;
                case TypeCode.Single:
                    _writer.Write((float)(object)value[i]);
                    break;
                case TypeCode.Int16:
                    _writer.Write((short)(object)value[i]);
                    break;
                case TypeCode.Int32:
                    _writer.Write((int)(object)value[i]);
                    break;
                case TypeCode.Int64:
                    _writer.Write((short)(object)value[i]);
                    break;
                case TypeCode.String:
                    _writer.Write((string)(object)value[i]);
                    break;
                case TypeCode.SByte:
                    _writer.Write((sbyte)(object)value[i]);
                    break;
                case TypeCode.UInt16:
                    _writer.Write((ushort)(object)value[i]);
                    break;
                case TypeCode.UInt32:
                    _writer.Write((uint)(object)value[i]);
                    break;
                case TypeCode.UInt64:
                    _writer.Write((ulong)(object)value[i]);
                    break;
                default:
                    if (typeof(T) == typeof(byte[]))
                    {
                        _writer.Write((byte[])(object)value[i]);
                    }
                    else if (typeof(T) == typeof(char[]))
                    {
                        _writer.Write((char[])(object)value[i]);
                    }
                    else
                    {
                        throw new ArgumentException("List type not supported");
                    }

                    break;
            }
        }
于 2011-07-20T22:39:26.583 に答える