2009-12-21 79 views
4

使用lambda表達式捕獲某些類的屬性或方法(如下面的代碼)有很多好處。如何使用lambda表達式捕獲靜態或非靜態屬性?

void CaptureProperty<T, TProperty> (Func<T, TProperty> exp) 
{ 
    // some logic to keep exp variable 
} 

// So you can use below code to call above method. 
CaptureProperty<string, int>(x => x.Length); 

但是,上面的代碼不支持靜態屬性。那麼,如何創建既支持靜態屬性又支持非靜態屬性的方法?

感謝,

回答

7

好了,你可以捕獲靜態屬性那樣:

CaptureProperty<string, Encoding>(x => Encoding.UTF8); 

然後,您需要提供但在執行時 「虛擬」 價值...

另一種方法是僅使用單一類型參數提供另一個超載:

void CaptureProperty<T>(Func<T> func) 
{ 
    // Whatever 
} 

使用是這樣的:

CaptureProperty<Encoding>(() => Encoding.UTF8); 

是你以後在做什麼?

如果你想統一兩個內部,你可以有一個「虛擬」的私人嵌套在同一類型中的類型CaptureProperty並實現靜態版本是這樣的:

void CaptureProperty<T>(Func<T> func) 
{ 
    CaptureProperty<DummyType, T>(x => func()); 
} 

然後,你可以檢測到當您需要稍後調用該功能時,「源」類型爲DummyType。這可能也可能不是一個有用的想法,取決於你在做什麼:)

+0

太棒了!空參數表達式。 – 2009-12-21 09:58:43

+0

我只是想將捕獲的屬性轉換爲類似「{className}。{propertyName}」的內容以發送到JavaScript。 – 2009-12-21 10:01:31

+0

@Soul_Master:在這種情況下,您希望'Expression >'而不是'Func '。 – 2009-12-21 10:03:51