Судя по вашему описанию, у вас есть три проекта в одном конвейере с этапом для каждого проекта и одним экземпляром EC2.
Почему бы не создать независимый конвейер для каждого проекта? В противном случае это звучит так, как будто вам нужно взаимное исключение на всех этапах проекта. Вы можете объединить три этапа и позволить CodePipeline обеспечить выполнение одного конвейера за раз, занимая этап.
Я должен, вероятно, упомянуть, основываясь на вашем вопросе, что CodePipeline предназначен для непрерывной доставки, и желательно, чтобы несколько изменений перемещались по конвейеру одновременно. Это более очевидно для глубоких конвейеров (т. Е. Если полное освобождение изменения занимает 3 дня, вы, вероятно, не хотите ждать 3 дня, прежде чем новое изменение сможет начать обход конвейера).
Лямбда-выражение конвертируемо или к типу делегата или к дереву выражений с правильной подписью - но необходимо указать, какой тип делегата это.
Я думаю, что Ваш код был бы намного более простым при создании этого общим методом:
public static List<object> ConvertToListOfObjects<T>(List<T> list)
{
return list.ConvertAll<object>(t => t);
}
Затем просто необходимо найти и вызвать тот метод в общем:
MethodInfo method = typeof(Foo).GetMethod("ConvertToListOfObjects",
BindingFlags.Static | BindingFlags.Public);
Type listType = list.GetType().GetGenericArguments()[0];
MethodInfo concrete = method.MakeGenericMethod(new [] { listType });
List<object> objectList = (List<object>) concrete.Invoke(null,
new object[]{list});
Полный пример:
using System;
using System.Reflection;
using System.Collections.Generic;
class Test
{
public static List<object> ConvertToListOfObjects<T>(List<T> list)
{
return list.ConvertAll<object>(t => t);
}
static void Main()
{
object list = new List<int> { 1, 2, 3, 4 };
MethodInfo method = typeof(Test).GetMethod("ConvertToListOfObjects",
BindingFlags.Static | BindingFlags.Public);
Type listType = list.GetType().GetGenericArguments()[0];
MethodInfo concrete = method.MakeGenericMethod(new [] { listType });
List<object> objectList = (List<object>) concrete.Invoke(null,
new object[] {list});
foreach (object o in objectList)
{
Console.WriteLine(o);
}
}
}
Лямбда формирует группу метода (в основном, это - метод, определенный по имени (и объем) только. Так как методы с тем же именем могут быть перегружены, группа метода включает несколько различных участников). Это не может всегда неявно преобразовываться в делегата, потому что делегат на самом деле связывается с отдельным методом из группы метода. Это играет роль с перегрузкой.
К сожалению, то же применяется в Вашем случае. Средство состоит в том, чтобы сделать явного делегата:
List<object> myConvertedList = (List<object>)m.Invoke(myList, new object[]{ new Func<YourType, object>(t => (object)t)});