gpt4 book ai didi

c# - 使用 lambda 表达式避免使用 "magic string"指定属性

转载 作者:太空狗 更新时间:2023-10-29 21:11:02 33 4
gpt4 key购买 nike

我正在编写一项服务来收集特定类型的对象和 output its primitive, string, and DateTime typesCSV Format 中的字符串.我有以下两个陈述。我发现基于 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 传递给 FindMemberExpression。我改编了 FindMemberExpression method of ExpressionProcessor.cs 中的代码来自 nhlambdaextensions project .我非常相似的 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 中测试足够多的情况?鉴于我的用例,我正在做的事情是否过大?

最佳答案

编辑:使这个更简单的核心是将您的方法的签名更改为在结果类型中也是通用的:

public IToCsvService<TSource> Exclude<TResult>(
Expression<Func<TSource, TResult>> expression)

这样您就不会得到转换表达式,因为不需要转换。例如,p => p.Minute最终会变成 Expression<Func<DateTime, int>>由于类型推断而自动。


这对我来说似乎有点矫枉过正,因为目前您所需要的只是一个属性 - 至少,这就是您的示例所显示的全部内容。

为什么不先识别一个属性,然后如果需要再扩展它呢?

编辑:这是一个简短但完整的示例,没有显示任何转化:

using System;
using System.Linq.Expressions;

class Test
{
static void Main()
{
Expression<Func<DateTime, int>> dt = p => p.Minute;
Console.WriteLine(dt);
}
}

如果将表达式类型更改为 Expression<Func<DateTime, long>>但是,它确实显示了 Convert(...)少量。我怀疑您需要更改 Exclude 的签名(等)方法。

关于c# - 使用 lambda 表达式避免使用 "magic string"指定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330758/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com