我正在编写一项服务来获取特定类型的对象集合输出其原始类型、字符串类型和日期时间类型 https://stackoverflow.com/questions/3161959/in-c-is-there-a-way-retrieve-only-built-in-data-type-properties-using-reflection到一个字符串CSV 格式 http://en.wikipedia.org/wiki/Comma-separated_values。我有以下两种说法。我发现基于 lambda 的版本要干净得多。
魔弦版
string csv = new ToCsvService<DateTime>(objs)
.Exclude("Minute")
.ChangeName("Millisecond", "Milli")
.Format("Date", "d")
.ToCsv();
与 Lambda 版本
string csv = new ToCsvService<DateTime>(objs)
.Exclude(p => p.Minute)
.ChangeName(p => p.Millisecond, "Milli")
.Format(p => p.Date, "d")
.ToCsv();
根据 Jon Skeet 的建议,所有 lambda 方法都共享相似的方法签名
public IToCsvService<T> Exclude<TResult>(
Expression<Func<T, TResult>> expression)
然后我通过expression.Body
to FindMemberExpression
。我已经改编了代码FindMemberExpressionExpressionProcessor.cs 的方法 http://code.google.com/p/nhlambdaextensions/source/browse/trunk/Source/ExpressionProcessor.cs#123来自nhlambda扩展项目 http://code.google.com/p/nhlambdaextensions/。我的版本非常相似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
?考虑到我的用例,我所做的事情是否太过分了?