如何仅将方法参数中对象的某些属性传递给 Fody/MethodTimer 拦截器

How to pass only some properties of an object in method parameters to Fody/MethodTimer Interceptor

我想通过 Fody/MethodTimer.

记录我的方法的执行时间

我不能只传递我的方法参数的某些属性(class 类型)。

我的方法:

[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; }
}

当我 运行 此代码时,出现以下错误:

Could not process 'System.Void TestCurrentEPCIS.Program::testFody(TestCurrentEPCIS.TestClass)' because the format uses 'obj.EventId' which is not available as method parameter.

当我如下传递对象本身时,它将 obj.ToString() 传递给拦截器 class:

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

如何将 obj 参数的一些属性传递给拦截器?

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; }
    }

根据 documentation,这是目前不支持的内容:

Note 1: sub-properties are not (yet?) supported.

编织器仅支持两种类型的参数通过属性:

The following values are allowed:

  • Any parameter name (e.g. {fileName})
  • {this} (calls ToString() on the instance itself) Note that this is not available on static methods, the weaver will throw an error if being used in a static method

(强调我的)

似乎您 可以 做的唯一一件事就是将属性包含在重写的 ToString 方法中。

编织器是开源的。如果您有时间可以专注于此,您可以考虑分叉该项目并进行必要的更新。 ParameterFormattingProcessor class 似乎是一个不错的起点,它使用基本的正则表达式来识别参数名称。