C# 测试父对象是否存在
我在项目中使用了大量数据库数据,这些数据以不同的类导出。例如,我有C# 测试父对象是否存在,c#,.net,null-check,C#,.net,Null Check,我在项目中使用了大量数据库数据,这些数据以不同的类导出。例如,我有 transaction.Layout.Multimedia.Images.first(); 问题是这些属性不一定可用 因此,transaction.Layout可能为空,transaction.Layout.Multimedia可能为空,依此类推 我目前在每一处房产上都使用此选项: if (transaction.Layout != null) { if (transaction.Layout.Multimedia !
transaction.Layout.Multimedia.Images.first();
问题是这些属性不一定可用
因此,transaction.Layout
可能为空,transaction.Layout.Multimedia
可能为空,依此类推
我目前在每一处房产上都使用此选项:
if (transaction.Layout != null)
{
if (transaction.Layout.Multimedia != null)
{
if (transaction.Layout.Multimedia.Images != null)
{
if (transaction.Layout.Multimedia.Images.count > 0)
{
var img = transaction.Layout.Multimedia.Images.first();
}
}
}
}
我想知道是否有更好的方法可以检查所有父类,以确保我需要的属性可用。这些不是我使用的唯一对象,还有其他名称完全不同的对象
提前谢谢不,还没有。新版本的.NET()具有以下特性:
然后你可以做:
if (transaction?.Layout?.Multimedia?.Image?.count > 0)
{
var img = transaction.Layout.Multimedia.Images.first();
}
就目前而言,我们仍在坚持这一点。您可以通过连接检查来最小化所需的行,如下所示:
if ( transaction.Layout != null
&& transaction.Layout.Multimedia != null
&& transaction.Layout.Multimedia.Images != null
&& transaction.Layout.Multimedia.Images.count > 0
)
{
var img = transaction.Layout.Multimedia.Images.first();
}
没什么可做的了。你可以尝试使用monad。有关更详细的说明,请参阅
With
和If
扩展方法允许您编写:
var img = transaction.With(x => x.Layout)
.With(x => x.Multimedia)
.With(x => x.Images)
.If(x => x.count > 0))
.With(x => x.first());
与
方法类似:
public static TResult With<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator)
where TResult : class where TInput : class
{
if (o == null) return null;
return evaluator(o);
}
这有点过分,但从理论上讲,您可以使用扩展方法来实现更简单的语法:
public static class GetterExtensions {
public static LayoutClass GetLayout(this TransactionClass transaction) {
if (transaction == null)
return null;
else
return transaction.Layout;
}
public static MultimediaClass GetMultimedia(this LayoutClass layout) {
if (layout == null)
return null;
else
return layout.Multimedia;
}
public static ImagesClass GetImages(this MultimediaClass multimedia) {
if (multimedia == null)
return null;
else
return multimedia.Images;
}
public static int? GetCount(this ImagesClass images) {
if (images == null)
return null;
else
return images.count;
}
}
(其中,LayoutClass
,MultimediaClass
等是各自属性的类型)
有了这个,你就可以写作了
if (transaction.GetLayout().GetMultimedia().GetImages().GetCount() > 0)
// ...
此解决方案利用了这样一个事实,即可以在null
对象上调用扩展方法,而不会引发异常。在这种情况下,他们只需将null
作为this
参数。也不是GetCount()
方法的int?
返回类型(null
),该方法允许为整数属性返回null
但是,如果您有许多对象(具有许多属性),此解决方案可能不切实际,并且需要大量额外的维护工作。另外,编写
GetLayout()
而不是简单的Layout
更不优雅。我想这就是你想要的。简单的答案是没有语法魔法可以帮助你做到这一点。没有捷径,但会有“?”操作符。如果是那样的话,我们得等一等。这个新版本有发布日期吗?我想你缺少了一个。(x=>x.Images)
(Images
也可以是null
)
if (transaction.GetLayout().GetMultimedia().GetImages().GetCount() > 0)
// ...