我希望这个问题不会令人困惑,我想做的是将匿名对象列表绑定到网格,我有一个class
Client
,我正在将客户端投影到匿名对象列表中,以便我可以在网格中显示其详细信息,如下所示:
this.gridControl1.DataSource = _clients.Select(c => new
{
c.ClientId,
c.FirstName,
c.LastName,
c.Details.Country, //throws NullReferenceException since I added a
//client with no details.
c.Details.City,
c.Details.Adress,
c.Details.Email
}).OrderByDescending(c => c.ClientId);
问题是某些客户端可能尚未添加详细信息。当试图绑定时,我显然得到了一个NullReferenceException
..我进行投影的原因是为了避免网格中Details
列,这是无用的。
那么,有什么解决方案吗?或者遇到这个问题的不同方法?谢谢
假设字段是字符串,请尝试
country = c.Details != null ? c.Details.Country : "", // or null or another
// appropriate default value
等,而不是
c.Details.Country
您可以使用三元运算符执行此操作:
c.Details == null ? null : c.Details.Country
如果不看到客户端是如何创建的,我不确定什么对你有用。 以下是一些建议:
-
使用具有字符串的"空白"详细信息对象实例化客户端。在所有属性中为空。
-
使 Client.Details 成为私有属性,然后公开公共属性(国家/地区、城市等),这些属性只有 getter,当私有 Details 对象为 null 时返回空字符串。 如果需要在外部访问 Details 对象,请使用方法而不是属性:
class Details { public string Country { get; set; } } class Client { private Details _details; public string Country { get { return _details == null ? string.Empty : _details.Country; } } public Details GetDetails() { return _details; } }
这将具有允许您消除匿名选择的额外好处,因为 Details 对象将不再是属性,因此被绑定过程忽略。 可以将客户端集合直接绑定到网格。