如何在多层项目中处理null或空值

时间:2017-06-09 02:56:47

标签: java c# android xamarin xamarin.android

我在Xamarin.android移动应用程序中工作。由于从api调用值设置为TextView.Text和ImageView的null值,我遇到了崩溃应用程序的问题。我想知道有没有更好的方法来处理任何应用程序层中的空值,即DataLayer或UI。因为我在我的项目中设置了这个结构。 MyApplication.DA(用于数据访问层)和我的所有getter和setter都在这里设置。在这种情况下,我将DA_WebSchoolNews.cs作为

 public class NewsServiceRootObject
{
    public List<DA_NewsServiceResult> NewsServiceResult { get; set; }
}

public class DA_NewsServiceResult
{
    public string CreatedDate { get; set; }
    public string Description { get; set; }
    public string Id { get; set; }
    public string Image { get; set; }
    public string PublishDate { get; set; }
    public string ShortDescription { get; set; }
    public string Title { get; set; }
    public string UserName { get; set; }
}

在MyApplication.Core中,这是一个共享项目,我调用了webapi服务来更新数据:

 public async void downloadJsonFeedAsync(string url)
    {
        var httpClient = new HttpClient();

        Task<string> contentTask = httpClient.GetStringAsync(url);

        // await! control returns to the caller and the task continues to run on another thread
        string content = await contentTask;
        Console.Out.WriteLine("Response Body: \r\n {0}", content);

        //Convert string to JSON object
        rootObject = Newtonsoft.Json.JsonConvert.DeserializeObject<NewsServiceRootObject>(content);

    }

在MyApplication.UI中,我创建了活动和片段视图的UI层。在我的适配器类中,我尝试处理空值,以便视图在运行时不会设置任何空值,我已按如下方式进行操作

 DA_NewsServiceResult item = this[position];
        if (string.IsNullOrEmpty(item.Title)|| string.IsNullOrEmpty(item.Description))
        {
            item.Title = "";
            item.Description = "";                             
        }

            var txtTitle = view.FindViewById<TextView>(Resource.Id.Title).Text = Android.Text.Html.FromHtml(item.Title).ToString();
            var txtDescription = view.FindViewById<TextView>(Resource.Id.Description).Text = Android.Text.Html.FromHtml(item.ShortDescription).ToString();
            var txtDate = view.FindViewById<TextView>(Resource.Id.news_date).Text = GetCustomDateTime(ConvertToDate(item.PublishDate));

对于字符串,日期时间,int或float类型数据以及如何处理null或empty的最佳方法是什么。如果适用的话,我会感谢代码行。谢谢。

2 个答案:

答案 0 :(得分:2)

在您的数据传输对象(在您的情况下为DA_NewsServiceResult)中,您可以使所有值类型属性都可以为空(例如int? / Nullable<int>DateTime?等。

在视图层中,您可以随时将所有内容作为对象处理并检查null,然后对视图执行最佳操作(可能隐藏通常会显示该值的视图元素)

这可以在一个非常通用且可重用的方法中处理,您可以向其传递属性值,也可以使用回调来处理有效值(以及在遇到空值时执行的操作的可选回调)< / p>

(作为旁注 - 在DTO(或基本上在任何地方)使用DateTimeOffset代替DateTime总是一个好主意,因为它包含了与UTC的偏移,可以更容易地转换为当地时间/时区特定时间)

替代方法:

制作通用扩展方法并检查给定值是否为默认值。例如。像这样。

public static class ObjectExtensions
{
    public static bool IsDefaultValue<TObject>(this TObject @object)
    {
        return EqualityComparer<TObject>.Default.Equals(@object, default(TObject));
    }
}

使用它可以检查每个属性是否为默认属性(尚未为结构/值类型设置,并为类对象设置null)并采取相应的行动。

添加字符串检查

如果您遇到空字符串但想在视图中使用空字符串,则可以执行以下操作。

var txtTitle = view.FindViewById<TextView>(Resource.Id.Title).Text = Android.Text.Html.FromHtml(item.Title ?? "").ToString();

答案 1 :(得分:1)

首先是字符串

String.IsNullOrEmpty(string);

DateTime

your_date == DateTime.MinValue

对于int int和float 将永远不会为null,因为它是基本类型。