我有一个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
有没有比这更好的代码?
答案 0 :(得分:11)
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");
}
将该类声明为抽象也可能有所帮助,但我不知道这是否适用于您的情况。