簡體   English   中英

如何包裝Func <dynamic, MyClass> 屬性

[英]How do I wrap Func<dynamic, MyClass> property

這是簡化的設置-我有API(我無法控制API),它公開了Func屬性,如下所示:

public Func<dynamic, MyClass> FuncProperty { get; set; }

通常這樣使用:

api.FuncProperty = s =>
   {
      do1();
      do2();
      return new MyClass(); //simplified
   }

到處都使用類似的代碼(當然{}中的內容是不同的),我想為所有這些添加通用功能,我想創建一個“包裝器”方法,可以這樣使用:

api.FuncProperty = MyWrapperMethod( 
   s =>
   {
      do1();
      do2();
      return new MyClass();
   });

我知道我可以將所有這些呼叫編輯為如下形式:

api.FuncProperty = s =>
  {
     DoMyCommonFunctionality();
     //... as before
  }

但是,如果我的常用功能是這樣的:

using(var disposable = SetSomeState())
{
   //the stuff which previously was in the lambda
}

那么,使用后一種方法是很丑陋的。

這就是為什么即使僅用於學習目的,包裝器的方法簽名也應該是什么樣的呢? 我應該如何使用它?

如果我理解正確,它還應該返回Func<dynamic, MyClass> ,如下所示:

public static Func<dynamic, MyClass> MyWrapperMethod(Func<dynamic, MyClass> func)
{
    // Validation if you want
    return d =>
    {
        using(var disposable = SetSomeState())
        {
            return func(d);
        }
    };
}

這是您想要的using陳述的示例。

請注意,調用MyWrapperMethod 叫你進入它的委托。 而是返回一個委托,該委托在被調用時將調用您傳遞的委托。 這種推遲執行可能會造成混淆,但是我相信這就是您想要的。

您可以執行以下操作:

public Func<dynamic, MyClass> MyWrapperMethod(Func<dynamic, MyClass> func)
{
    if (func == null)
        throw new ArgumentNullException("func");

    return s => {
        DoMyCommonFunctionality();

        // Execute original function
        return func(s);
    };
}

請注意,您似乎正在使用委托屬性來模擬方法。 對我來說,這聽起來像是一個非常糟糕的體系結構。

有多種方法可以執行此操作:

建議一

為您的代表創建一個不同的簽名:

 public Func<HelperObject<dynamic>, MyClass> FuncProperty { get; set; }

然后,您的方法將發生如下變化:

 api.FuncProperty = h =>
    {
        //h.Model is the dynamic
        //h.CommonHelperFunction()
        return new MyClass();
    };

然后像這樣調用:

 api.FuncProperty(new HelperObject(someDynamic));

建議二

在dynamic上創建擴展方法,以提供所需的數據。

public static MyHelperClass CreateHelper(this object obj)
{
     return new MyHelperClass();
}

然后您可以像這樣使用它:

api.FuncProperty = s =>
  {
      var helper = (s as object).CreateHelper();

      return new MyClass();
  };

建議三

從您的對象中刪除委托作為屬性,並將其更改為方法抽象:

 public MyClass ExecuteFunc(Func<dynamic, MyClass> selector)
 {
      Func<MyClass> helper = () =>
         {
             DoCommonFunctionality();
             return selector(x.Model);
         };

      return helper();
 }

然后,您將這樣致電:

 api.ExecuteFunc(x => 
    {
        return new MyClass();
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM