[英]How do I return all items in a collection that possess an interface property of a specific type?
我有一个ApprovalTicket类,该类具有一个名为ApprovalRules的属性,该属性的类型为IApproval:
IApproval ApprovalRules;
该字段将包含实现该接口的几种不同类型的类。 现在提高一级,我将获得一个ApprovalTickets清单。 我正在尝试使用linq返回具有类型为MocReviewerApproval的ApprovalRules的ApprovalTicket列表。
我正在尝试类似的东西:
var reviews = request.MocApprovalTasks
.Where(mocApproval => mocApproval.ApprovalRules is MocReviewerApproval)
.ToList();
但是,当我检查返回的列表时,它仍然包含具有MocManagerApproval和其他ApprovalRules类型的票证。 我想念什么?
更新:
让我更具体一点。 这是继承方案
MocApproval : TaskTicket
>>IApproval ApprovalRules;
MocReviewerApproval : IApproval
MocManagerApproval : IApproval
MocControllerApproval : IApproval
internal interface IApproval
{
bool Approve(Guid approverGuid, MocApproval approval);
bool Deny(Guid approverGuid, MocApproval approval, TaskComment denialComment);
bool Close(Guid approverGuid, MocApproval approval, TaskComment closeComment);
bool Notify();
void Set(MocApproval approval);
User GetAssignee();
TaskComment GetNotificationComment();
}
is
意味着可以被有效地强制转换为不是“正是这种类型”。 就您而言, MocReviewerApproval
类仍将返回true。 您可以使用:
mocApproval.ApprovalRules.GetType() == typeof(MocReviewerApproval)
以确保该类型(只有该类型)将返回true。 话虽这么说,有这样的东西有点不好闻。 考虑问问自己这是否真的是你想要的。
您的代码对我来说很好。 我怀疑你有诊断的问题,或者你不后的is
一种关系都没有。 这是一个完整的示例,说明其工作原理:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Foo
{
public object Value { get; set; }
}
class Test
{
static void Main()
{
var list = new List<Foo>
{
new Foo { Value = "" },
new Foo { Value = 10 },
new Foo { Value = new object() },
new Foo { Value = new MemoryStream() }
};
ShowCount<IDisposable>(list); // 1 (MemoryStream)
ShowCount<IFormattable>(list); // 1 (Int32)
ShowCount<IComparable>(list); // 1 (String, Int32)
}
static void ShowCount<T>(List<Foo> list)
{
var matches = list.Where(f => f.Value is T)
.ToList();
Console.WriteLine("{0} matches for {1}",
matches.Count, typeof(T));
}
}
编辑:如果您要匹配的正是给定的类型,请使用:
var reviews = request.MocApprovalTasks
.Where(task => task.ApprovalRules.GetType() ==
typeof(MocReviewerApproval))
.ToList();
与根据Servy的原始答案查找名称相比,这对重构更友好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.