Вопрос

Просто хочу сделать простое расширение для синтаксический сигар :

public static bool IsNotEmpty(this ICollection obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}

public static bool IsNotEmpty<T>(this ICollection<T> obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}

Это отлично работает, когда я работаю с некоторыми коллекциями, но при работе с другими я получаю

Вызов неоднозначен между следующими методами или свойствами:'PowerOn.Расширения базовые.Пусто (System.Коллекции.IList)' и 'PowerOn.Расширения базовые.IsNotEmpty(Система.Коллекции.Общий.Моя коллекция)'

Есть ли какие - нибудь канонический решение этой проблемы ?

Нет, я не хочу выполнять приведение перед вызовом этого метода ;)

Это было полезно?

Решение 2

Мой лучший способ разрешить двусмысленность :определите перегрузку для всех распространенных классов ICollection, не являющихся универсальными.Это означает, что пользовательская ICollection не будет совместима, но это не имеет большого значения, поскольку дженерики становятся нормой.

Вот весь код целиком :

/// <summary>
/// Check the given array is empty or not
/// </summary>
public static bool IsNotEmpty(this Array obj)
{
    return ((obj != null)
        && (obj.Length > 0));
}
/// <summary>
/// Check the given ArrayList is empty or not
/// </summary>
public static bool IsNotEmpty(this ArrayList obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given BitArray is empty or not
/// </summary>
public static bool IsNotEmpty(this BitArray obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given CollectionBase is empty or not
/// </summary>
public static bool IsNotEmpty(this CollectionBase obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given DictionaryBase is empty or not
/// </summary>
public static bool IsNotEmpty(this DictionaryBase obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given Hashtable is empty or not
/// </summary>
public static bool IsNotEmpty(this Hashtable obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given Queue is empty or not
/// </summary>
public static bool IsNotEmpty(this Queue obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given ReadOnlyCollectionBase is empty or not
/// </summary>
public static bool IsNotEmpty(this ReadOnlyCollectionBase obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given SortedList is empty or not
/// </summary>
public static bool IsNotEmpty(this SortedList obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given Stack is empty or not
/// </summary>
public static bool IsNotEmpty(this Stack obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}
/// <summary>
/// Check the given generic is empty or not
/// </summary>
public static bool IsNotEmpty<T>(this ICollection<T> obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}

Обратите внимание, что я не хотел, чтобы это работало на IEnumerable<T>, потому что Count() это метод, который может инициировать запрос к базе данных, если вы работаете с Linq-to-Entity или Linq-to-SQL.

Другие советы

Это связано с тем, что некоторые коллекции реализуют оба интерфейса, вы должны преобразовать коллекцию в конкретный интерфейс следующим образом

((ICollection)myList).IsNotEmpty();

Или

((ICollection<int>)myIntList).IsNotEmpty();

И да, вы получите исключение NullReferanceException, если obj == null, так что вы можете удалить проверку null ;) что означает, что ваш метод расширения просто сравнивает количество с 0, что вы можете сделать без метода расширения ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top