0

IApproval タイプの ApprovalRules というプロパティを持つクラス ApprovalTicket があります。

IApproval ApprovalRules;

このフィールドには、そのインターフェースを実装するいくつかの異なるタイプのクラスが含まれます。1 つ上のレベルに進むと、ApprovalTickets のリストが作成されます。私がやろうとしているのは、linq を使用して、MocReviewerApproval タイプの ApprovalRules を持つ ApprovalTickets のリストを返すことです。

私は次のようなことを試みていました:

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 に答える