gpt4 book ai didi

c# - 对值类型和引用类型使用 C# LINQ 表达式

转载 作者:行者123 更新时间:2023-11-30 14:40:11 26 4
gpt4 key购买 nike

我正在使用 MVC for REST,这样我就可以利用 Razor 来输出不同的类型。 CSV 是这些输出之一。而不是为每种输入类型编写此模板:

ID,Created,Content
@foreach (var item in Model.TimeData)
{
<text>@item.ID,@item.Created,"@Html.Raw(item.Content.Replace("\"", "\"\""))"</text>
}

我想利用 paramsSystem.Linq.Expressions.Expression 来写这样的东西:

@{
Html.WriteCsv<TimeObject>(Model.TimeData, p => p.ID, p => p.Created, p => p.Content);
}

我开始编写一个通用的 HtmlHelper 并很快意识到我在值类型方面存在问题(memberExpression 将为 null)。下面的代码试图只写出 CSV 标题 (ID,Created,Content),但它只输出“Content”(因为 ID 和 Created 是值类型(intDateTime).

public static void WriteCsv<TModel>(this HtmlHelper htmlHelper, List<TModel> list, params Expression<Func<TModel, object>>[] expressions)
{
foreach (var expression in expressions)
{
MemberExpression memberExpression = expression.Body as MemberExpression;

if (memberExpression != null)
{
var propertyInfo = (PropertyInfo)memberExpression.Member;

htmlHelper.ViewContext.Writer.Write(propertyInfo.Name + Environment.NewLine);
}
}
}

我尝试将 object 替换为 dynamic,认为这样可行,但当我快速观看 expression.Body 时,它似乎仍然认为它正在处理一个对象(DebugView 属性是 (System.Object)$p.ID)。

这在 C# 4.0 中是不可能的吗?

这是我正在使用它的类型:

[DataContract(IsReference = true, Namespace = "urn:test:TimeObject")]
public class TimeObject
{
[DataMember]
public long ID { get; set; }

[DataMember]
public string Content { get; set; }

[DataMember]
public DateTime Created { get; set; }
}

最佳答案

在表达式引用值类型的情况下,编译器必须将引用装箱;它是隐含地这样做的。这种复杂性意味着值类型成员表达式的表达式树不仅仅是一个 MemberExpression,因此您的转换将返回 null。

以下是从值类型或引用类型成员表达式中获取属性名称的通用解决方案,摘自this question :

private string GetPropertyName(Expression<Func<object, object>> f) {
var body = f.Body;
if (body.NodeType==ExpressionType.Convert)
body = ((UnaryExpression) body).Operand;
if ((body as MemberExpression) != null) {
return (body as MemberExpression).Member.Name;
}
return "";
}

关于c# - 对值类型和引用类型使用 C# LINQ 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707561/

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