0

我有一个 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();
    }
4

2 回答 2

2

is意味着,可以有效地转换为,而不是,“正是这种类型”。在您的情况下,任何子类MocReviewerApproval仍将返回 true。您可以使用:

 mocApproval.ApprovalRules.GetType() == typeof(MocReviewerApproval)

以确保该类型,并且只有该类型,将返回 true。话虽如此,拥有这样的东西有点糟糕的代码气味。考虑问问自己这是否真的是你想要的。

于 2012-08-15T21:18:03.570 回答
1

你的代码对我来说看起来不错。我怀疑你有诊断问题,或者你根本不追求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 的原始答案查找名称更便于重构。

于 2012-08-15T21:18:19.747 回答