Как назвать метод от MethodCallExpression в c#

Этот веб-клиент на самом деле не работает в контексте клиента (веб-API), который его вызывает, и реферер не будет заполнен.

Я не могу проверить это прямо сейчас, но в основном UrlReferer - это не что иное, как заголовок HTTP Referer. Таким образом, теоретически вы можете добавить этот заголовок к WebClient самостоятельно ...

client.Headers.Add("Referer","whatever_you_want_to_add");

Вы будете добавлять его вручную, что не идеально, но это лучшее, что вы можете сделать. Помните, что заголовок Referer не установлен, если:

  • Указанный ресурс является локальным файлом или URI
  • Запрос не защищен, а указанный ресурс защищен [116 ]
20
задан SteveC 24 September 2013 в 10:14
поделиться

3 ответа

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

Например,

MethodCallExpression expression = GetExpressionSomeHow();
object result = Expression.Lambda(expression).Compile().DynamicInvoke();

Вот как я в любом случае имею дело с вложенными запросами в моем провайдере Linq. LambdaExpression в переменной выбора. В этом случае вы должны иметь возможность просто скомпилировать и вызвать его напрямую:

object result = selector.Compile().DynamicInvoke();
26
ответ дан 30 November 2019 в 00:14
поделиться

Compiling an expression is a very intensive operation, so I would only do that if you are planning on re-using the expression. I would recommend the reflection way otherwise; you will find it executes faster. Never call expression.Compile() in a tight loop.

7
ответ дан 30 November 2019 в 00:14
поделиться

@ Ch00k <- Спасибо, хорошее объяснение. Я просто хотел бы добавить, что

selector.Compile();

дает вам делегата. Для метода экземпляра вам нужен экземпляр, на котором можно вызвать этот метод. Вы передаете этот экземпляр в качестве аргумента DynamicInvoke ala

// Grab the method from MyClass - param1 and param2 are the actual parameters you
// want to pass to the method call.
Expression<Func<MyClass, TValue>> selector = (x => x.MyMethod(param1, param2));

// Create an instance of MyClass to call the method on
var myClass = new MyClass();

// Call the method on myClass through DynamicInvoke
object returnValue = selector.Compile().DynamicInvoke(myClass);
1
ответ дан 30 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

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