C# 在匿名类型中包含基于条件的属性

C# 在匿名类型中包含基于条件的属性,c#,.net,anonymous-types,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,

假设我有以下匿名类型

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.
});

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

不直接使用
if
语句,但可以使用三元运算符(假设
TimeIn
类型为
DateTime
):

注意,这将使属性始终显示在注释类型中。如果这不是你想要的行为,那么你就不能这样做


我建议您考虑代码的可读性,而不仅仅是“如何缩短这几行,使其看起来整洁”。

您可以使用

语法如下所示:

TimeIn = condition ? r.ArriveTime : (DateTime?)null // Or DateTime.Min or whatever value you want to use as default
更新 在考虑了几分钟您的问题后,我想出了以下代码,您永远都不应该使用;)


这段代码不应该在生产中使用,因为它的可读性很差,而且很容易出错。但是,作为一个学习该语言的示例,它非常好。

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


我建议将属性设置为
null
,就像在其他答案中一样,或者使用
字典添加相关属性及其值。

如果在匿名类型创建中确实需要
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,
});
var g=records。选择(r=>new
{
Id=r.C.编号,
TimeIn=新函数(x=>
{
如果(…)
返回x;
其他的
返回null;
}).调用(r.到达时间),
超时=r.LeaveTime,
});

var g=records.Select(r=>new{Id=r.cardino,TimeIn=condition?r.ArriveTime:null TimeOut=r.LeaveTime});不,这是不可能的。匿名是强类型的。当
条件
在运行时得到解决时,您会期望什么行为?我认为cast可以解决问题@pwasIt当您不知道从这样一个对象中期望得到什么时,使用它将是不可能的或非常困难的。您必须首先检查属性是否存在,然后检查它是否有值。如果
r.ArriveTime
的可能重复项是不可为null的类型,则必须将其强制转换为可为null。否则
运算符将在编译时失败。
r.ArriveTime
(或null)必须强制转换为可为null的类型
(DateTime?)r.ArriveTime):null
-否则表达式将在编译时失败。他实际需要的是根据条件将属性“TimeIn”添加到匿名类型中。如果条件的计算结果为false,则他不想将该属性添加到类型中。您是否真的希望在创建对象之前使用这样的代码来避免使用
If
语句?正如我在回答中提到的,我个人不会这样做。但这是一种选择。
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);
    }
}
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,
});