Почему IEntityCollection внутренняя / Как найти EntityCollection <T>.Count? - PullRequest
2 голосов
/ 03 августа 2010

В службах RIA EntityCollection<T> класс определяется следующим образом:

public sealed class EntityCollection<TEntity> : IEntityCollection, 
                                                IEnumerable<TEntity>, 
                                                IEnumerable,  
                                                INotifyCollectionChanged,  
                                                INotifyPropertyChanged where TEntity :  
                                                global::System.ServiceModel.DomainServices.Client.Entity

У меня есть конвертер Silverlight, который устанавливает Visibility в зависимости от количества элементов в списке.

 if (value is EntityCollection<CustomerFeedbackDetail>)
 {
      visible = (value as EntityCollection<CustomerFeedbackDetail>).Count > 0;
 }

Но подождите - я хочу, чтобы он был общим для любой коллекции EntityCollection. Э-э - IEntityCollection является внутренним и недоступным для нас. EntityCollection даже не реализует ICollection.

Я застрял без использования отражения (чего я действительно не хотел бы делать, так как в некоторых случаях это может вызываться много раз в секунду).

Я почти уверен, что мне нужно использовать отражение, чтобы сделать это универсальным - так что в таком случае, почему IEntityCollection будет внутренним? Надзор?

1 Ответ

3 голосов
/ 03 августа 2010

Вместо того, чтобы использовать отражение, вы можете просто реализовать эту функцию самостоятельно. Вы не заботитесь о количестве, просто это не ноль. Просто перепишите функцию Enumberable.Any(IEnumerable<T>), чтобы взять неуниверсальный IEnumerable:

public static bool Any(this System.Collections.IEnumerable source)
{
    if (source == null)
        throw new ArgumentNullException("source");

    return source.GetEnumerator().MoveNext();
}

Тогда в вашем конвертере вы получите:

if (value is EntityCollection<CustomerFeedbackDetail>) 
{ 
    visible = (value as IEnumerable).Any(); 
} 
...