繁体   English   中英

如何返回集合中具有特定类型的interface属性的所有项目?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM