Я пытаюсь создать некоторую статистику о длительности вызова метода в библиотеке. Вместо того, чтобы обертывать каждый метод, вызовите библиотеку с линиями по времени и отслеживайте ее, я хочу создать общее действие и функцию, которая выполняет эти повторяющиеся шаги.Объявление общей функции в C#
E.g. для методов, которые не возвращают значение, я создал это:
private readonly Action<string, Action> timedAction = (name, action) =>
{
var sw = Stopwatch.StartNew();
action.Invoke();
trackDuration(name, sw.ElapsedMilliseconds);
};
Это может быть вызвана с timedAction("methodname",() => lib.methodname())
.
Я хочу сделать что-то подобное для методов, возвращающих значение, но, очевидно, Action
не может использоваться для этой цели, так как он не может вернуть значение.
Есть ли способ сделать это с помощью общего Func
, поэтому мне не нужно объявлять один для каждой комбинации параметров метода библиотеки?
Возможно, вы захотите посмотреть на решения AOP, такие как PostSharp для этого типа вещей. –
Также рассмотрите группу методов [Tuple.Create] (https://msdn.microsoft.com/en-us/library/system.tuple.create (v = vs.110) .aspx). Невозможно написать методы, допускающие произвольное количество генериков. –
Вызывающий может тривиально передавать любой вызов как «действие», просто делая его выражением: 'timedAction (« methodname »,() => {lib.methodname (1, 2, 3);})'. –