【发布时间】:2015-10-08 08:54:15
【问题描述】:
我有以下类/接口:
public interface IUiCommand-
public class StartLandenSynchronisatieUiCommand : IUiCommand;public class SyncGeldverstrekkersUiCommand : IUiCommand;等 public class RibbonButtonAggregateViewModel<TCommand> : RibbonButtonViewModel<TCommand> where TCommand : IUiCommandpublic abstract class RibbonButtonViewModel<TCommand> : ResizableRibbonItem where TCommand : IUiCommand-
RibbonButtonViewModel的其他一些实现类。
RibbonButtonViewModel 包含一个属性KeyTip。
在我正在处理的 UnitTest 中,我有一个包含两个项目的列表:RibbonButtonAggregateViewModel<StartLandenSynchronisatieUiCommand> 和 RibbonButtonAggregateViewModel<SynGeldverstrekkersUiCommand(这只是一个示例,我有更多列表具有不同的 IUiCommands 或其他实现的 @ 类987654333@).
我想要的是这个列表作为 RibbonButtonViewModels,这样我就可以在 for-each 中访问他们的 KeyTip-property。
基于这个SO question & answer,我能够正确过滤列表,所以我仍然有两个列表:
// `items` is the list containing the two RibbonButtonAggregateViewModels
var correctItems = items.Where(x =>
{
if (!x.GetType().IsGenericType) return false;
var baseType = x.GetType().BaseType;
if (baseType == null || !baseType.IsGenericType) return false;
return baseType.GetGenericTypeDefinition() == typeof (RibbonButtonViewModel<>);
})
.ToList();
即使我正确过滤列表并在 RibbonButtonViewModels 和 IUiCommand 作为泛型类型时获取这两个项目,但我没有得到 RibbonButtonViewModels 的结果来访问 KeyTip。我尝试在Where 和ToList 之间添加以下两个之一,但都不起作用:
-
.OfType<RibbonButtonViewModel<IUiCommand>>()-> 结果为空列表 -
.Select(x => x as RibbonButtonViewModel<IUiCommand>)-> 结果列表中包含两个null
那么,当我有子项列表时,我应该如何获得RibbonButtonViewModel 的列表来访问KeyTip-属性。 (PS:不必特别是RibbonButtonAggregateViewModel,任何以RibbonButtonViewModel为基础的实现类都可以,只要列表返回为RibbonButtonViewModels,这样我就可以访问KeyTip-property。
【问题讨论】:
标签: c# linq generics reflection types