如何检查基类对象或派生对象?

时间:2012-07-03 06:49:49

标签: c# .net oop

我有一个BankAccount课程。 FixedBankAccountSavingsBankAccount来自它 如果收到的对象不是派生对象,我需要抛出异常。我有以下代码。

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

有没有比这更好的代码?

5 个答案:

答案 0 :(得分:11)

您应该使用Type.IsAssignableFrom

if (acc.GetType().IsAssignableFrom(typeof(BankAccount)))
    // base class
else
    // derived

答案 1 :(得分:5)

将BankAccount类声明为Abstract。

答案 2 :(得分:2)

使用Type.IsSubclassOf方法。有关详情,请查看this

foreach (DBML_Project.BankAccount acc in accounts)
{
    if (!acc.GetType().IsSubclassOf(typeof(DBML_Project.BankAccount))
    {
        throw new Exception("Not correct derived type");
    }
}

答案 3 :(得分:2)

我会定义一个接口(类似于IAccettableBankAccount,但你知道你的域名,所以你应该能够找到一个更好的名字)并让FixedBankAccount和SavingsBankAccount实现它。然后你的测试就是:

if (!acc is IAccettableBankAccount)
{
     throw new Exception("Not correct derived type");
}

答案 4 :(得分:0)

您可以直接检查类型:

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

将该类声明为抽象也可能有所帮助,但我不知道这是否适用于您的情况。