调用 C# 委托,然后在 powershell 中处理回调

问题描述 投票:0回答:1

假设我有一个 C# 中的 BankBalance 类,它定义了一个函数 DebitTransaction。 DebitTransaction 执行以下操作。 如果余额>要借记的金额,则会借记该金额并通知调用者操作成功。否则它会通知调用者操作失败。

下面是 C# DLL 中的代码如下

using System;
namespace BankSystem
{
    public class BankBalance
    {
        public int Balance { get; set; } = 1000;
        // Define a delegate that informs the caller about the transaction status
        public delegate void DebitTransactionStatus(string message);
        public void DebitTransaction(int Debit, DebitTransactionStatus debitTransactionStatus)
        {
            if (Balance >= Debit)
            {
                Balance -= Debit;
                debitTransactionStatus("Amount is Debited Successfully");
            }
            else
            {
                debitTransactionStatus("Not enough balance to perform debit operation");
            }
       }
    }
}

下面的代码是请求借方操作的调用者(C# exe调用C# DLL函数DebitTransaction)。

using System;
using BankSystem;
namespace Transaction
{
    class DebitTransaction
    {
        static void ShowDebitTransactionStatus(string message)
        {
            Console.WriteLine(message);
        }
        static void Main(string[] args)
        {
            BankBalance bankBalance = new BankBalance();
            BankBalance.DebitTransactionStatus debitTransactionStatus = new BankBalance.DebitTransactionStatus(ShowDebitTransactionStatus);
            bankBalance.DebitTransaction(500, debitTransactionStatus);
            bankBalance.DebitTransaction(600, debitTransactionStatus);
        }
    }
}

上面的程序有效,这是输出

金额已扣款成功

余额不足,无法进行借记操作

我需要从 powershell 调用 C# DLL 函数 DebitTransaction 函数(调用 C# 委托并注册回调)以获得类似的结果

这对我来说是一个很大的帮助,因为我是一名 C++/C# 开发人员,但由于我们公司缺乏资源,现在在 PowerShell 中做自动化工作。我也是 PowerShell 的新手。 (我正在开发的项目有许多具有委托和回调的导出函数)

我尝试了几个链接,但这些链接对我不起作用。 https://renenyffenegger.ch/notes/Microsoft/dot-net/namespaces-classes/System/Delegate/CreateDelegate/example-PowerShell/index

c# powershell callback delegates
1个回答
0
投票
在这种情况下,

PowerShell 可以将

ScriptBlock
转换为
DebitTransactionStatus
委托,稍微更新演示代码,使其与 C# 5 兼容并在 Windows PowerShell 5.1 中编译。这是它的样子:

Add-Type @'
namespace BankSystem
{
    public class BankBalance
    {
        private int _balance = 1000;
        public int Balance
        {
            get { return _balance ;}
            set { _balance = value; }
        }
        // Define a delegate that informs the caller about the transaction status
        public delegate void DebitTransactionStatus(string message);
        public void DebitTransaction(int Debit, DebitTransactionStatus debitTransactionStatus)
        {
            if (Balance >= Debit)
            {
                Balance -= Debit;
                debitTransactionStatus("Amount is Debited Successfully");
            }
            else
            {
                debitTransactionStatus("Not enough balance to perform debit operation");
            }
       }
    }
}
'@

$balance = [BankSystem.BankBalance]::new()
$balance.DebitTransaction(1000, { param($message) Write-Host $message })
# Amount is Debited Successfully
$balance.DebitTransaction(1000, { param($message) Write-Host $message })
# Not enough balance to perform debit operation
© www.soinside.com 2019 - 2024. All rights reserved.