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