特定の型のオブジェクトのコレクションを取得し、そのプリミティブ型、文字列型、および DateTime 型をCSV Formatの文字列に出力するサービスを作成しています。以下のステートメントの両方が機能しています。ラムダベースのバージョンの方がずっときれいだと思います。
魔法のひものバージョン
string csv = new ToCsvService<DateTime>(objs)
.Exclude("Minute")
.ChangeName("Millisecond", "Milli")
.Format("Date", "d")
.ToCsv();
vs. Lambda バージョン
string csv = new ToCsvService<DateTime>(objs)
.Exclude(p => p.Minute)
.ChangeName(p => p.Millisecond, "Milli")
.Format(p => p.Date, "d")
.ToCsv();
Jon Skeet の推奨に従って、すべてのラムダ メソッドは同様のメソッド シグネチャを共有します。
public IToCsvService<T> Exclude<TResult>(
Expression<Func<T, TResult>> expression)
expression.Body
次に、をに渡しFindMemberExpression
ます。nhlambdaextensions プロジェクトFindMemberExpression
の ExpressionProcessor.cs のメソッドからコードを採用しました。私の非常によく似たバージョンは以下のとおりです。FindMemberExpression
private string FindMemberExpression(Expression expression)
{
if (expression is MemberExpression)
{
MemberExpression memberExpression = (MemberExpression)expression;
if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess
|| memberExpression.Expression.NodeType == ExpressionType.Call)
{
if (memberExpression.Member.DeclaringType.IsGenericType
&& memberExpression.Member.DeclaringType
.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if ("Value".Equals(memberExpression.Member.Name))
{
return FindMemberExpression(memberExpression.Expression);
}
return String.Format("{0}.{1}",
FindMemberExpression(memberExpression.Expression),
memberExpression.Member.Name);
}
}
else
{
return memberExpression.Member.Name;
}
}
throw new Exception("Could not determine member from "
+ expression.ToString());
}
で十分なケースをテストしていFindMemberExpression
ますか? 私のユースケースを考えると、私がやっていることはやり過ぎですか?