Как передать в Fody/MethodTimer Interceptor только некоторые свойства объекта в параметрах метода

Я хочу регистрировать время выполнения моих методов с помощью Fody/MethodTimer.

Я не могу передать только некоторые свойства параметров моих методов (которые являются типом класса).

Мой метод:

[Time("'{obj.EventId}'")]
private static void testFody(TestClass obj)
{
     for (int i = 0; i < 100; i++)
     {
          Console.WriteLine($"This is : {i }");
     }
}

public class TestClass
{
    public Guid EventId { get; set; }

    public string prop1 { get; set; }

    public int prop2 { get; set; }
}

Когда я запускаю этот код, я получаю следующую ошибку:

Не удалось обработать «System.Void TestCurrentEPCIS.Program::testFody(TestCurrentEPCIS.TestClass)», поскольку формат использует «obj.EventId», который недоступен в качестве параметра метода.

И когда я передаю сам объект следующим образом, он передает obj.ToString() в класс Interceptor:

[Time("'{obj}'")]
private static void testFody(TestClass obj)

Как я могу передать некоторые свойства моих параметров obj в Interceptor??


person Javad Norouzi    schedule 31.03.2019    source источник


Ответы (2)


Согласно документации , это в настоящее время не поддерживается:

Примечание 1. Подресурсы (пока?) не поддерживаются.

Weaver поддерживает только два типа аргументов через атрибут:

Допускаются следующие значения:

  • Любое имя параметра (например, {fileName})
  • {this} (вызывает ToString() для самого экземпляра). Обратите внимание, что это недоступно для статических методов, ткач выдает ошибку, если используется в статическом методе.

(выделено мной)

Кажется, единственное, что вы могли сделать, — это включить свойства в переопределенный метод ToString.

Уивер с открытым исходным кодом. Если у вас есть время, которое вы можете посвятить этому, вы можете рассмотреть возможность разветвления проекта и внесения необходимых обновлений. Хорошим местом для начала является ParameterFormattingProcessor. класс, который использует базовое регулярное выражение для определения имени параметра.

person pinkfloydx33    schedule 31.03.2019

Eventid — это типизированное свойство Guid, и его необходимо инициализировать, поэтому попробуйте следующий код:

 public class TestClass
    {
   private Guid _EventId;
   public Guid EventId { 
      get=> (_Eventid = 
          _Eventid==null ?  Guid.NewGuid() :
           _Eventid);

      set=>_EventId=value; 
         }

        public string prop1 { get; set; }

        public int prop2 { get; set; }
    }
person isaeid    schedule 31.03.2019
comment
Привет. Спасибо за ответ, но это не проблема. Проблема в том, что Fody сопоставляет точный obj.EventId с параметрами метода и говорит, что я не могу найти такой параметр. - person Javad Norouzi; 31.03.2019