要在我的Windows Phone 8应用程序中的页面之间共享数据(复杂数据)我想实现单例,但我希望它是通用的,是否可能?我想它为每种类型创建一个新实例不是吗?
public sealed class NavigationContextService<T>
{
private static readonly NavigationContextService<T> instance = new NavigationContextService<T>();
private NavigationContextService()
{
}
public static NavigationContextService<T> Instance
{
get
{
return instance;
}
}
public List<T> ShareList { get; set; }
public T ShareData { get; set; }
}
答案 0 :(得分:0)
它正在为每种类型创建一个新实例,因为它是通用的 - 你希望它是这样的(如果你从泛型开始,看看一些教程,博客或MSDN - 你会很容易在互联网上找到很多。)
它仍然是一个单身人士。当你使用
NavigationContextService<string>.Instance.ShareList.Add("Text");
然后您有一个类型为string
的实例。当您想要创建类型不同的相同方法/类时,泛型可以提供很多帮助。
另一方面,如果你想创建包含不同类型的Singleton,那么你可以将你的类修改为非Generic,如下所示:
public sealed class NavigationContextServiceNonGeneric
{
private static readonly NavigationContextServiceNonGeneric instance = new NavigationContextServiceNonGeneric();
private NavigationContextServiceNonGeneric() { ShareList = new List<object>(); }
public static NavigationContextServiceNonGeneric Instance
{ get { return instance; } }
public List<object> ShareList { get; set; }
public object ShareData { get; set; }
}
正如您在上面的代码中所看到的,我没有定义共享数据的“确切”类型 - 它是object
类型。然后,您可以轻松地保存大部分数据:
NavigationContextServiceNonGeneric.Instance.ShareList.Add("Text");
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3);
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3.0f);
它是单例,可以容纳不同类型的共享数据。 但它也有缺点 - 主要是你必须记住你持有的数据类型和顺序。在我看来,由于这个事实,通用版本更好。
一切都取决于您的代码的目的。这两种方法可能会有更简单,更好的方法。
对于页面导航,您可以尝试使用this article中的方法 - 扩展导航服务以传递对象:
public static class Extensions
{
private static object Data;
public static void Navigate(this NavigationService navigationService, Uri source, object data)
{
Data = data;
navigationService.Navigate(source);
}
public static object GetNavigationData(this NavigationService service) { return Data; }
}
然后你使用它:
NavigationService.Navigate(yourUri, DataToPass);
导航后,您可以获取数据:
string myTextData = NavigationService.GetNavigationData() as string;
此方法有以下缺点:它不是类型安全的,并且您的数据不会在逻辑删除模式下保留。
至于第二个缺点,您可以轻松地使用PhoneApplicationService.State Property进行页面导航 - 它是一个字典(在逻辑删除时保留):
PhoneApplicationService.Current.State.Add("data", yourData);
然后当您想要获取数据时:
yourDataType yourData = PhoneApplicationService.Current.State["data"] as yourDataType;
您还可以通过更多方式传递数据。