3

一般的な方法で BinaryReader Read メソッドを使用しようとしています。実行時にのみ、読み取られるデータのタイプを知っています。

   public static T ReadData<T>(string fileName)
        {
            var value = default(T);

            using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (var reader = new BinaryReader(fs))
                {
                    if (typeof (T).GetGenericTypeDefinition() == typeof (Int32))
                    {
                        value = (dynamic) reader.ReadInt32();
                    }
                    if (typeof (T).GetGenericTypeDefinition() == typeof (string))
                    {
                        value = (dynamic) reader.ReadString();
                    }
                    // More if statements here for other type of data
                }
            }
            return value ;
        }  

複数の if ステートメントを避けるにはどうすればよいですか?

4

1 に答える 1

1

リフレクション (遅い) を使用する以外に、私が考えることができる唯一のオプションは、辞書を作成することです。

static object s_lock = new object();
static IDictionary<Type, Func<BinaryReader, dynamic>> s_readers = null;
static T ReadData<T>(string fileName)
{
    lock (s_lock)
    {
        if (s_readers == null)
        {
            s_readers = new Dictionary<Type, Func<BinaryReader, dynamic>>();
            s_readers.Add(typeof(int), r => r.ReadInt32());
            s_readers.Add(typeof(string), r => r.ReadString());
            // Add more here
        }
    }

    if (!s_readers.ContainsKey(typeof(T))) throw new ArgumentException("Invalid type");

    using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
    using (var reader = new BinaryReader(fs))
    {
        return s_readers[typeof(T)](reader);
    }
}

これを呼び出すコードはきれいになりますが、各 Read 関数を型にマップする必要があります。

于 2012-11-30T19:36:34.223 に答える