Нет метода Exists, поэтому я хочу использовать AsQueryable для защитного программирования
Я пишу некоторый код, который запрашивает объектную модель Visual Studio.
Я вижу что нет Exists
метод на Projects
объект коллекции, но мне нравится защитное программирование, а не использование блоков catch. Итак, я вижу, что есть AsQueryable()
на Projects
объект, и мне было интересно, может ли это помочь.
Я вижу здесь код, который я хочу написать,
IQueryable<Student> query =
objStudent.AsQueryable().Where(student => student.Name.Contains("Alavala"));
но для меня это было бы что-то вроде
IQueryable<EnvDTE.Project> query =
sol.Projects.AsQueryable().Where(proj => proj.Name=project);
но это не компилируется с сообщением об ошибке
"IQueryable" не содержит определения "Где", а метод расширения "Где", принимающий первый аргумент типа "IQueryable", не найден (вы пропустили директиву using или ссылку на сборку?)
Это просто недостающая ссылка? Вот минимальный восстанавливаемый код...
using System.Linq;
using System.Runtime.InteropServices;
namespace AsQueryableConsoleApp
{
class Program
{
static void Main(string[] args)
{
/* ensure the solution is running in a separate instance of Visual Studio 2017 */
string solution = @"C:\Users\Simon\source\repos\WebApplication1\WebApplication1.sln";
string project = "WebApplication1";
//string projectItem = "WebForm1.aspx";
object objSol = Marshal.BindToMoniker(solution); /* should bind if running */
EnvDTE.Solution sol = (EnvDTE.Solution)objSol; /* does a cast */
/* next line does not compile with error message
Error CS1061
'IQueryable' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'IQueryable' could be found (are you missing a using directive or an assembly reference?) AsQueryableConsoleApp
*/
IQueryable<EnvDTE.Project> query = sol.Projects.AsQueryable().Where(proj => proj.Name = project);
}
}
}
1 ответ
EnvDTE.Projects не является "универсальной коллекцией", он реализует только неуниверсальный IEnumerable ( https://docs.microsoft.com/en-us/dotnet/api/envdte.projects?view=visualstudiosdk-2017).
Вам необходимо преобразовать в общий IEnumerable<T>
во-первых, используя Cast
или же OfType
:
var query = sol.Projects.OfType<EnvDTE.Project>().Where(proj => proj.Name == project);