1

IEnumerable を実装する .net フレームワークのクラスのいずれかが ICollection インターフェイスを実装していないかどうかを知りたいです。

私が書いた次の拡張メソッドでは 100% のコード カバレッジが得られないため、質問しています。

public static int GetSafeCount<T>(this IEnumerable<T> nullableCollaction)
    {
        if (nullableCollaction == null)
        {
            return 0;
        }
        var collection = nullableCollaction as ICollection<T>;
        if (collection != null)
        {
            return collection.Count;
        }
        return nullableCollaction.Count();
    }

最後の行はどのテストでもカバーされておらず、それをカバーするためにインスタンス化する正しいクラスが見つかりません。

私のテストコードは次のとおりです。

[Test]
    public void GetSafeCount_NullObject_Return0()
    {
        IEnumerable<string> enumerable=null;

        Assert.AreEqual(0, enumerable.GetSafeCount());
    }
    [Test]
    public void GetSafeCount_NonICollectionObject_ReturnCount()
    {
        IEnumerable<string> enumerable = new string[]{};

        Assert.AreEqual(0, enumerable.GetSafeCount());
    }
4

3 に答える 3

1

Stack<T>クラスを使用できます。それは and を実装しますが、 は実装ICollectionIEnumerable<T>ませんICollection<T>

クラスの定義方法は次のとおりです。

public class Stack<T> : IEnumerable<T>, IEnumerable, ICollection, 
    IReadOnlyCollection<T>
于 2016-06-15T11:24:17.713 に答える
0

彼はIEnumerable<T>ではない の例ですICollection<T>:

public class MyClass : IEnumerable<int>
{
    public List<int> ints = new List<int> { 1, 2, 3, 4, 5 };

    public IEnumerator<int> GetEnumerator()
    {
        foreach (var i in ints)
        {
            yield return i;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this as IEnumerator;
    }
}

今、あなたはこれを行うことができます:

foreach(var item in new MyClass())
{
    // do something
}

しかし、これは ICollection ではないため、これを行うことはできません

var coll = new MyClass() as ICollection<int>; // null!!!
于 2016-06-15T11:27:50.653 に答える