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

时间:2019-03-31 09:19:00

标签: c# fody

我想通过 Fody / MethodTimer 记录我的方法的执行时间。

我无法仅传递方法参数的某些属性(属于类类型)。

我的方法:

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

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

  

无法处理'System.Void   TestCurrentEPCIS.Program :: testFody(TestCurrentEPCIS.TestClass)'   因为格式使用的'obj.EventId'不能作为方法使用   参数。

当我按如下方式传递对象本身时,它将obj.ToString()传递给Interceptor类:

{{1}}

如何将obj参数的某些属性传递给Interceptor?

2 个答案:

答案 0 :(得分:1)

根据documentation,当前不支持此功能:

  

注意1:不支持子属性。

Weaver通过属性仅支持两种类型的参数:

  

允许以下值:

     
      
  • 任何参数名称(例如{fileName})
  •   
  • {this}((在实例本身上调用ToString())。请注意,这在静态方法上不可用,如果   用于静态方法
  •   

(强调我的)

您似乎唯一可以做的就是将属性包含在覆盖的ToString方法中。

Weaver是开源的。如果有时间可以专用于此,则可以考虑分叉项目并进行必要的更新。一个不错的起点似乎是ParameterFormattingProcessor类,它使用基本的Regex标识参数名称。

答案 1 :(得分:-1)

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