2010-09-10 1 views
3

У меня есть ряд классов, которые реализуют определенный интерфейс (ISearchable), и я хотел бы вернуть IEnumerable базового типа (ISearchable) из статического метода, но я не уверен, как его преобразовать, не делая промежуточных коллекций.Преобразование общей коллекции конкретного типа в коллекцию базового типа

Код довольно прост, одна из реализаций объектов предметной области, как так:

public class account : ISearchable 
{ 
    public static IEnumerable<ISearchable> Search(string keyword) 
    { 
     // ORMVendorCollection<T> implements IQueryable<T> 
     ORMVendorCollection<account> results = /* linq query */ 

     // this works if I change the return type to IEnumerable<account> 
     // but it uglifies client code a fair bit 
     return results.AsEnumerable<account>(); 

     // this doesn't work, but it's what I'd like to achieve    
     return results.AsEnumerable<ISearchable>(); 
    } 
} 

клиентский код, в идеале выглядит следующим образом:

public static IEnumerable<ISearchable> Search(string keyword) 
{ 
    return account.Search(keyword) 
     .Concat<ISearchable>(order.Search(keyword)) 
     .Concat<ISearchable>(otherDomainClass.Search(keyword)); 
} 

ответ

7

Использование метода Cast<T> расширения

return results.Cast<ISearchable>(); 
+0

Спасибо Джареду. редактирование: * ждет 10 минут * –

1

Не могли бы вы просто что-нибудь сделать?

public class account : ISearchable 
{ 
    public static IEnumerable<ISearchable> Search(string keyword) 
    { 
     var results = /* linq query */ 
     foreach(var result in results) 
      yield return result; 
    } 
} 
2

Для C# 4.0, вы можете быть в состоянии непосредственно отбрасывать, поскольку IEnumerable<> является covariant

return (IEnumerable<ISearchable>)results.AsEnumerable(); 
+0

+1 но, увы, на данный момент я ограничен .NET 3.5. –

+0

Отклонение работает в структуре 3.5, просто прискорбно, что у вас не могут быть языковые функции. (Но я уверен, что вы можете создать библиотеку классов, которая использует дисперсию, и использовать ее из приложения 3.5) –