[英]How do I dynamically create an Expression<Func<MyClass, bool>> predicate from Expression<Func<MyClass, string>>?
[英]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.