0

我有一本这样的字典:

private Dictionary<string, List<SmartTextItemModel>> service_ListOfItems = new Dictionary<string, List<SmartTextItemModel>>();

service_ListOfItems["bingsearch"] = MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.BingItemResults;
service_ListOfItems["wikipedia"] = MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.WikipediaItemResults;
service_ListOfItems["youtube"] = MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.YoutubeItemResults;

(SmartTextItemModel 只是一个简单的类,用于包含标题、描述和 URL,它们都是字符串。有关上下文,请参阅我之前的问题。)

当然,%service%ItemResults 对象的类型是 List<SmartTextItemModel>,并且 List 在 SmartTextStateModel 文件中被初始化为 null。

我在其他文件中有代码修改每个MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.%service%ItemResults列表,如下所示:

MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.%service%ItemResults = some new List of type SmartTextItemModel

当我尝试检查初始化字典的同一文件中的列表是否为空时,

if (service_ListOfItems[ searchService ] == null) { ... } // searchService is "bingsearch", "wikipedia", or "youtube"

我没有得到我期望的结果。if 语句中的语句始终运行。字典中的 List 值仍然为 null,即使它们被分配到不同的文件中。

我想要的行为是我的字典引用了MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel. 我怎样才能做到这一点?

4

1 回答 1

2

您正在寻找的行为是不可能的。在字典中放置对 List 的引用后,该引用将引用特定的 List,并且不会受到您用于初始化项目的静态属性的未来更改的影响。

要检查属性是否为空,您需要一个在每次引用字典时都会获取列表的方法。您可以使用 lambda 表达式将字典更改为Dictionary<string, Func<List<SmartTextItemModel>并为每个项目分配代表,如下所示:

service_ListOfItems["bingsearch"] = () => MyProgramKernel.Instance.SmartTextViewModel.SmartTextStateModel.BingItemResultsl;

然后使用if (service_ListOfItems[searchService]() == null)获取和调用函数。(请注意索引器后面的额外括号,因为您必须调用函数。)

现在,这并不完全优雅,您可能应该考虑是否有完全不同的方法来解决您的问题。但是,它应该可以工作。

于 2013-03-21T22:09:41.627 回答