根据匿名类型中的条件包含属性

时间:2014-12-30 09:25:13

标签: c# .net anonymous-types

假设我有以下匿名类型

var g = records.Select(r => new
{                    
    Id = r.CardholderNo,
    TimeIn = r.ArriveTime,
    TimeOut = r.LeaveTime,
});

是否可以执行以下操作:

var g = records.Select(r => new
{                    
    Id = r.CardholderNo,
    if (condition) 
    {
        TimeIn = r.ArriveTime;
    },
    TimeOut = r.LeaveTime,
    //many more properties that I'd like to be dependant on conditions.
});

如何根据条件实现匿名类型?

4 个答案:

答案 0 :(得分:4)

不直接使用if语句,但您可以使用三元运算符(假设TimeIn类型为DateTime)来执行此操作:

var g = records.Select(r => new
{

    Id = r.CardholderNo,
    TimeIn = condition ? r.ArriveTime : (DateTime?)null;
    TimeOut = r.LeaveTime
});

请注意,这会使属性始终显示在“匿名类型”中。如果这不是所需的行为,那么你就不能这样做。

我建议考虑代码的可读性,而不仅仅是关于"如何缩短这几行,使它看起来整洁"。

答案 1 :(得分:3)

您可以使用ternary operator: ?:

执行此操作

语法如下:

TimeIn = condition ? r.ArriveTime : (DateTime?)null // Or DateTime.Min or whatever value you want to use as default

更新

在考虑了几分钟的问题后,我想出了以下代码,你永远不应该使用它;)

using System;

class Program
{
    static void Main(string[] args)
    {
        DateTime dt = DateTime.Now;

        bool condition = true;

        dynamic result = condition ?
            (object)new
            {
                id = 1,
                prop = dt
            }
            :
            (object)new
            {
                id = 2,
            };

        Console.WriteLine(result.id);
        if (condition) Console.WriteLine(result.prop);
    }
}

此代码永远不应该用于生产中,因为它的可读性很差,并且它确实容易出错。然而,作为一个学习的例子,说明这种语言的可能性是非常好的。

答案 2 :(得分:3)

没有。匿名类型与任何其他类型一样。它有一个固定的属性列表。您无法动态添加或删除属性。

我建议将属性设置为null,与其他答案一样,或者使用Dictionary添加相关属性及其值。

答案 3 :(得分:1)

如果你真的需要在匿名类型创建中使用if(或任何其他语句),你可以试试这个不那么漂亮的解决方案:

var g = records.Select(r => new
{
    Id = r.CardholderNo,
    TimeIn = new Func<DateTime?, DateTime?>(x =>
            {
            if (...)
                return x;
            else
                return null;
            }).Invoke(r.ArriveTime),
    TimeOut = r.LeaveTime,
});