Как я вызываю метод посредством отражения с лямбда-выражением в качестве параметра?

Судя по вашему описанию, у вас есть три проекта в одном конвейере с этапом для каждого проекта и одним экземпляром EC2.

Почему бы не создать независимый конвейер для каждого проекта? В противном случае это звучит так, как будто вам нужно взаимное исключение на всех этапах проекта. Вы можете объединить три этапа и позволить CodePipeline обеспечить выполнение одного конвейера за раз, занимая этап.

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

5
задан juan 12 January 2009 в 19:40
поделиться

2 ответа

Лямбда-выражение конвертируемо или к типу делегата или к дереву выражений с правильной подписью - но необходимо указать, какой тип делегата это.

Я думаю, что Ваш код был бы намного более простым при создании этого общим методом:

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);
        }
    }
}
5
ответ дан 14 December 2019 в 13:49
поделиться

Лямбда формирует группу метода (в основном, это - метод, определенный по имени (и объем) только. Так как методы с тем же именем могут быть перегружены, группа метода включает несколько различных участников). Это не может всегда неявно преобразовываться в делегата, потому что делегат на самом деле связывается с отдельным методом из группы метода. Это играет роль с перегрузкой.

К сожалению, то же применяется в Вашем случае. Средство состоит в том, чтобы сделать явного делегата:

List<object> myConvertedList = (List<object>)m.Invoke(myList, new object[]{ new Func<YourType, object>(t => (object)t)});
1
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: