Насмешки носорога: я могу использовать Тупик (), когда одним из моих параметров является Выражение <Func <T1, T2>>?

Вы можете выполнить XPath относительно каждого элемента asset, чтобы получить vin и gps напрямую, без зацикливания:

for asset_xml in root.findall("./assetlist/asset"):
    print(asset_xml.attrib['id'])

    vin = asset_xml.find("vin")
    print(str(vin.text))

    gps = asset_xml.find("gps")
    print(str(gps.text))
6
задан Jon Kruger 13 May 2009 в 13:41
поделиться

2 ответа

Вы можете создать метод, который оценивает равенство между двумя выражениями:

public class ExpressionMatcher
{
    public static Expression<Action<T>> Matches<T>(Expression<Action<T>> action)
    {
        var methodName = ((MethodCallExpression) action.Body).Method.Name;
        return Arg<Expression<Action<T>>>.Matches(a => ((MethodCallExpression)a.Body).Method.Name.Equals(methodName));
    }
}

Затем измените оператор-заглушку, чтобы заключить выражение в вызов средства сопоставления выражений:

service.Stub(s => s.GetPropertyOfExistingObject(Arg<int>.Is.Equal(1), ExpressionMatcher.Matches<Quote>(q => q.QuoteNumber))).Return(1234);
3
ответ дан 17 December 2019 в 04:51
поделиться

Я думаю, проблема связана с тем, как выражения проверяют равенство. Я только что провел быстрый тест в компиляторе фрагментов, и мои выражения никогда не оценивались как одно и то же:

    Expression<Func<int, string>> p = i => i.ToString();
    Expression<Func<int, string>> s = i => i.ToString();
    var b = p.Equals(s) || p == s;

(b было ложным для этого теста)

Вероятно, чтобы ваш тест работал как есть, вам придется игнорировать фактическое значение второго параметра (которое может быть приемлемым или неприемлемым; если неприемлемо, я думаю, вам придется пойти по маршруту WhenCalled).

2
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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