6

BankAccountクラスがあります。FixedBankAccountそしてSavingsBankAccountそれから派生しています。
受信したオブジェクトが派生オブジェクトでない場合は、例外をスローする必要があります。私は次のコードを持っています。

IEnumerable<DBML_Project.BankAccount> accounts = AccountRepository.GetAllAccountsForUser(userId);
foreach (DBML_Project.BankAccount acc in accounts)
{
    string typeResult = Convert.ToString(acc.GetType());
    string baseValue = Convert.ToString(typeof(DBML_Project.BankAccount));

    if (String.Equals(typeResult, baseValue))
    {
        throw new Exception("Not correct derived type");
    }
}

namespace DBML_Project
{

public  partial class BankAccount
{
    // Define the domain behaviors
    public virtual void Freeze()
    {
        // Do nothing
    }
}

public class FixedBankAccount : BankAccount
{
    public override void Freeze()
    {
        this.Status = "FrozenFA";
    }
}

public class SavingsBankAccount : BankAccount
{
    public override void Freeze()
    {
        this.Status = "FrozenSB";
    }
}

} // namespace DBML_Project

これより良いコードはありますか?

4

5 に答える 5

11

使用する必要がありますType.IsAssignableFrom

if (acc.GetType().IsAssignableFrom(typeof(BankAccount)))
    // base class
else
    // derived
于 2012-07-03T06:53:03.443 に答える
5

BankAccountクラスをAbstractとして宣言します。

于 2012-07-03T06:53:39.340 に答える
2

Type.IsSubclassOfメソッドを使用します。詳細については、これを確認してください

foreach (DBML_Project.BankAccount acc in accounts)
{
    if (!acc.GetType().IsSubclassOf(typeof(DBML_Project.BankAccount))
    {
        throw new Exception("Not correct derived type");
    }
}
于 2012-07-03T06:54:58.137 に答える
2

インターフェイス(IAcettableBankAccountのようなものですが、ドメインを知っているので、より適切な名前を見つけることができるはずです)を定義し、FixedBankAccountとSavingsBankAccountに実装させます。次に、テストは次のようになります。

if (!acc is IAccettableBankAccount)
{
     throw new Exception("Not correct derived type");
}
于 2012-07-03T08:46:38.977 に答える
0

タイプを直接確認できます。

    var accounts = AccountRepository.GetAllAccountsForUser(userId);
    if (accounts.Any(acc => acc.GetType() == typeof(DBML_Project.BankAccount))) {
        throw new Exception("Not correct derived type");
    }

クラスを抽象として宣言することも役立つかもしれませんが、それがあなたの場合のオプションであるかどうかはわかりません。

于 2012-07-03T06:53:42.663 に答える