C#, Как преобразовать Выражение <Func <SomeType>> в Выражение <Func <OtherType>>

Есть несколько моментов, кроме только ответа:

a) input () Python по умолчанию возвращает строку, вам не нужно конвертировать с помощью преобразования строки.
[111 ] б) Есть лучший способ прочитать файл в Python, используя ключевое слово - «с».
c) Вы проверяете цикл после проверки условия с той же переменной - 'x'. Кажется неправильным!
d) Чтобы ответить на вопрос: функция strip возвращает None, и вы пытаетесь повторить ее, поэтому ошибка. Вместо этого вы можете напрямую заменить код следующим образом:

answer = "2"
if answer == "2":
    f = open("users.txt", "r")    
    x = input("Please enter a valid username: ")
    for line in f:

         if (x) in (line.strip()):
                for i in range(0,5):
                    print('Hi',x)

15
задан Michiel van Oosterhout 19 May 2013 в 13:48
поделиться

2 ответа

С Expression, самый простой путь с выражением преобразования:

class Foo {
    public int Value { get; set; }
}
class Bar {
    public int Value { get; set; }
}
static class Program {
    static void Main() {
        Expression<Func<Foo, bool>> predicate =
            x => x.Value % 2 == 0;
        Expression<Func<Bar, Foo>> convert =
            bar => new Foo { Value = bar.Value };

        var param = Expression.Parameter(typeof(Bar), "bar");
        var body = Expression.Invoke(predicate,
              Expression.Invoke(convert, param));
        var lambda = Expression.Lambda<Func<Bar, bool>>(body, param);

        // test with LINQ-to-Objects for simplicity
        var func = lambda.Compile();
        bool withOdd = func(new Bar { Value = 7 }),
             withEven = func(new Bar { Value = 12 });
    }
}

Обратите внимание однако, что это будет поддерживаться по-другому различными поставщиками. EF не мог бы понравиться он, например, даже если LINQ-SQL делает.

Другая опция состоит в том, чтобы восстановить дерево выражений полностью, с помощью отражения для нахождения членов-корреспондентов. Намного более сложный.

21
ответ дан 1 December 2019 в 02:46
поделиться

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

var translatedPredicate = x => originalPredicate(OtherTypeFromSomeType(x))

Где OtherTypeFromSomeType создает OtherType экземпляр от SomeType аргумент.

2
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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