我在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的最佳方法是什么。如果适用的话,我会感谢代码行。谢谢。
答案 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,因为它是基本类型。