Csharp/C#教程:对值类型和引用类型使用C#LINQ表达式分享


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

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

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

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

 @{ Html.WriteCsv(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(this HtmlHelper htmlHelper, List list, params Expression<Func>[] 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); } } } 

我尝试用dynamic替换object ,认为这会起作用,但是当我快速观察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; } } 

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

以下是从“值类型”或“引用类型”成员表达式获取属性名称的一般解决方案,取自此问题 :

上述就是C#学习教程:对值类型和引用类型使用C#LINQ表达式分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 private string GetPropertyName(Expression> 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 ""; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/943388.html

(0)
上一篇 2021年11月14日
下一篇 2021年11月14日

精彩推荐