仕事が遅い時間に、C# から F# にコーディングした小さな DB アクセス フレームワークを変換したいと考えていました。このフレームワークは、ダイナミクスと ExpandoObjects を広範囲に使用します。特に、頭を悩ませている次のビットがあります。
public static List<dynamic> ToDynamic(this IDataReader reader)
{
dynamic result = new List<dynamic>();
while (reader.Read())
{
var item = new ExpandoObject();
var dc = item as IDictionary<String, object>;
for (int i = 0; i < reader.FieldCount; i++)
{
dc.Add(reader.GetName(i), DBNull.Value.Equals(reader[i]) ? null : reader[i]);
}
result.Add(item);
}
return result;
}
これをどのように F# に変換しますか? これが私が思いつくことができるすべてです:
let (~~) (x:obj) =
match x with
| :? 't as t -> t
| _ -> null
let rec mapper (reader : SqlDataReader) : list<'Value> =
match reader.Read() with
| false -> []
| true ->
let dc = new ExpandoObject()
let dictionary = ~~dc : Dictionary<string, obj>
[for i in [0 .. reader.FieldCount - 1] do
dictionary.Add(reader.GetName(i), reader.GetValue(i))] @ mapper reader
もちろん、ディクショナリはサイクルで null になります。C#の演算子~~
を置き換えることになっていたが、as
物事はそれほど単純ではないと思う。金曜日のことかもしれませんが、本当に先が見えません。