如何从 C# 中的 class 构造函数获取所有对象的参数

How do I obtain a parameter of all objects from a class constructor in c#

我正在使用 c#.NET 制作一种非常基本的在线 ATM 应用程序。基本上我创建了一个名为 account 的 class 并使用了一个构造函数来存储客户的账户,使它们成为 class 的对象。这些客户需要输入密码才能登录。客户的 pin 是客户对象的参数之一,我一直在尝试制作一个循环,循环遍历所有个人客户并确定该 pin 属于哪个帐户。

 class Account
 {
    public string customerName;
    public string pin;
    public int balance;

    public Account(string accCustomerName, string accPin, int accBalance)
    {
        customerName = accCustomerName;
        pin = accPin;
        balance = accBalance;
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    Account acc1 = new Account("Henry_Adobe", "2316", 10000);
    Account acc2 = new Account("Patrick_Boka", "3198", 15000);
    Account acc3 = new Account("Fred_Simp", "8768", 20000);
    Account acc4 = new Account("Derek_Black", "7645", 25000);

    if (txtInput.Text == acc1.pin)
    {
        MessageBox.Show("Login Succesful!");
    }
}

我已经通过声明每个对象的特定名称 (acc1.pin) 设法访问了 pin,但这效率不高,因为它需要我输入每个对象的名称。有什么方法可以方便地访问所有账户的参数吗?

我会带你更进一步,因为每次运行时都会忘记最后余额的 ATM 应用程序不是很有用。

让我们从Account开始 class:

class Account
{
    public string CustomerName {get;set;};
    public string PIN {get;set;};
    public decimal Balance {get;set;};

    public Account(string customerName, string Pin, decimal balance)
    {
        CustomerName = customerName;
        PIN = Pin;
        Balance = balance;
    }

    public static IList<Account> Accounts {get;private set;} = new List<Account>();

    public static void ReadAccounts(string fileName)
    {
        using var rdr = new Microsoft.VisualBasic.FileIO.TextFieldParser(AccountsFileName))
        {
            rdr.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
            rdr.Delimiters = new string[] {','};
            Accounts.Clear();
            string[] row = null;
            while( (row = rdr.ReadFields()) != null)
            {
                Accounts.Add(new Account(row[3], row[0], Decimal.Parse(row[1])));
            }
        }
    }

    public static void WriteAccounts(string fileName)
    {
        using (var writer = new StreamWriter(fileName, false))
        {
            writer.WriteLine("PIN,Balance,CustomerName");
            foreach(var acct in Accounts)
            {
                writer.WriteLine($"{acct.PIN},{acct.Balance},\"{acct.CustomerName}\"");
            }
        }
    }
}

我们将字段更新为具有有意义数据类型的属性,添加了一个静态位置来保存帐户列表,并添加了从文件读取和写入的方法。稍后,您将用某种数据库替换 csv 文件,但这将帮助您入门。

现在让我们继续加载表单:

private string AccountsFileName = "AccountsFile.csv";

private void Form1_Load(object sender, EventArgs e)
{
    Account.ReadFile(AccountsFileName);
}

但我们需要到此为止。在加载表单时,用户还没有机会输入任何文本!除了文本框之外,您还需要一个按钮,用户可以在其中输入 pin 后单击以登录:

private Account currentAccount = null;

private void btnLogin_Click(object sender, EventArgs e)
{
    currentAccount = Account.Accounts.FirstOrDefault(a => a.PIN == txtInput.Text);
    if (currentAccount != null) 
    {
        MessageBox.Show("Login successful!");
        return;
    }
    MessageBox.Show("Login failed");
}   

最后,您需要一种在程序结束时保存文件的方法。现在我只使用 Form1_Closing 事件,但稍后您可能需要一些不同的东西:

private void Form1_Closing(object sender, EventArgs e)
{
    Account.WriteAccounts(AccountsFileName);
}

您仍然缺少向用户显示余额并允许他们存款和取款的能力。此外,任何值得使用的 ATM 都需要显示单独的 交易 ,通常存储为两个抵消分类账条目。