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

Я хочу записать время выполнения моих методов с помощью 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.VoidTestCurrentEPCIS.Program :: testFody (TestCurrentEPCIS.TestClass) ', поскольку в формате используется' obj.EventId ', который недоступен в качестве параметра метода.

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

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

Как передать некоторые свойства параметров obj в Interceptor ??

Ответы [ 2 ]

1 голос
/ 31 марта 2019

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

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

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

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

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

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

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

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

0 голосов
/ 31 марта 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; }
    }
...