2010-08-03 1 views
2

В RIA сервисов, которые EntityCollection<T> class определяется следующим образом:Почему IEntityCollection является внутренним/Как найти EntityCollection <T> .Count?

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. Uh oh - IEntityCollection является внутренним и недоступным для нас. EntityCollection даже не реализует ICollection.

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

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

+0

Изготовление 'IEntityCollection' внутренний не проглядеть; не удалось реализовать «ICollection». – Gabe

ответ

3

Вместо того, чтобы использовать отражение, вы можете просто реализовать функцию самостоятельно. Вы не заботитесь о графе, просто это отличное от нуля. Просто переписать функцию 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(); 
} 
+0

ему не понравилось «использование», но работает отдельно от этого! благодаря! пс. какой механизм обработки исключений вы используете, чтобы иметь Error.ArgumentNull? –

+0

Некоторые интересные заметки о «Any()» против «Count» от Phil Haack: http://haacked.com/archive/2010/06/10/checking-for-empty-enumerations.aspx –

+0

Исходный код был просто копия 'Enumberable.Any (IEnumerable )' с '' удален. Поскольку 'IEnumerable' не реализует' IDisposable', 'use' не принадлежал. Я исправил код и устранил внешние зависимости. – Gabe

 Смежные вопросы

  • Нет связанных вопросов^_^