2010-08-23 54 views
1

我們有一個.Net對象,它有一個靜態委託(數據訪問策略),必須在實例化對象之前設置它。委託也可以通過構造函數重載之一傳入。從PowerShell設置靜態委託屬性(或將委託傳遞給構造函數)

我有另一個對象,有委託,我需要設置,但我無法弄清楚在PowerShell中如何做到這一點。有誰知道如何設置靜態委託屬性或將委託傳遞給PowerShell中的構造函數?

我想要做一些與此類似:

[DALObject]$db = New-Object DALObject; 
[UnitOfWork]::Strategy = $db::CreateContext; 

[DALObject]$db = New-Object DALObject; 
[UnitOfWork]$uow = New-Object UnitOfWork($db::CreateConext); 

僅供參考我試圖重現媲美C#代碼:

DalObject db = new DALObject(); 
UnitOfWork.Strategy = db.CreateContext; 

UnitOfWork uow = new UnitOfWork(db.CreateContext); 

編輯:爲了澄清戰略是一個靜態的代表

Public static Func<DataContext> Strategy 

和createContext的,我想設置爲委託的實例方法,通過設置靜態屬性,或者在方法傳遞給構造函數。

另一種選擇是,如果有出現在PowerShell中的方式來創建在C#中的匿名委託這樣的:

UnitOfWork.Strategy = delegate() 
      { 
       var ctx = db.CreateContext(); 
       return ctx; 
      }; 
+0

如果你試圖像'$ db.CreateContext'那樣訪問'CreateContext',它可能會工作。 (從您的C#示例看起來像'CreateContext'不是靜態屬性,而是實例屬性) – stej 2010-08-23 19:57:15

回答

2

無法通過實例對象訪問靜態成員(在此假設createContext的一個靜態屬性,儘管它被命名爲一個方法)。嘗試:

[DALObject]$db = New-Object DALObject; 
[UnitOfWork]::Strategy = [DALObject]::CreateContext 

,或者如果它是這樣一種方法

[DALObject]$db = New-Object DALObject; 
[UnitOfWork]::Strategy = [DALObject]::CreateContext() 

OTOH如果的createContext是一個實例成員然後用或不用括號取決於它是否是一個方法或不改變[DALObject]::CreateContext$db.CreateContext

更新:在將腳本塊分配給泛型委託的情況下,沒有內置的方法來使其工作AFAIK。看看這個blog post for a potential work-around