【问题标题】:Settings a static delegate property from PowerShell (or passing a delegate to the constructor)从 PowerShell 设置静态委托属性(或将委托传递给构造函数)
【发布时间】:2011-04-02 20:09:27
【问题描述】:

我们有一个 .Net 对象,它有一个静态委托(一种数据访问策略),必须在实例化对象之前设置该委托。委托也可以通过构造函数重载之一传入。

我有另一个对象,它具有我需要设置的委托,但我无法在 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);

编辑:澄清 Strategy 是静态委托

Public static Func<DataContext> Strategy 

而 CreateContext 是一个实例方法,我想通过设置静态属性或将方法传递给构造函数来设置该委托。

如果 PowerShell 中有一种方法可以在 C# 中创建像这样的匿名委托,那么另一种选择是:

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

【问题讨论】:

  • 如果你尝试像$db.CreateContext 一样访问CreateContext,它可能会起作用。 (从您的 C# 示例来看,CreateContext 不是静态属性,而是实例属性)

标签: powershell delegates


【解决方案1】:

您不能通过实例对象访问静态成员(假设 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

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多