假设我有一个父类User,如下所示
class User{
int Id {get;set;}
UserType Type {get;set;}
//More properties
}
然后我有两个子对象
class Employer : User
{
// UserType should always be employer
//some methods and properties
}
class JobSeeker : User
{
// UserType should always be JobSeeker
//some methods and properties
}
有时我会获得一个Id而我会查询数据库并加载用户。但是,根据用户是雇主还是求职者,我想做不同的事情。
我现在这样做的方式如下:
userRepository.TryLoad(userId, out user)
if (user.UserType == UserType.Employer)
{
//do some stuff
}
else if (user.UserType == UserType.JobSeeker)
{
// do some other stuff
}
我想知道我是否可以做以下事情:
userRepository.TryLoad(userId, out user)
if (user is Seeker)
{
//do some other stuff
}
else if (user is Employer)
{
//do some stuff
}
编辑===
如果我的userRepository.TryLoad()给了我一个user.UserType = UserType.Employer的用户,如果我使用
var employer = user as Employer
雇主总是空的。
===编辑2 ====
用户定义的转换似乎是我可以去的一种方式,然后"作为"和"是"关键字不适用于用户定义的转化
http://msdn.microsoft.com/en-us/library/aa288476(v=vs.71).aspx
答案 0 :(得分:1)
您可能需要考虑在User上创建一个公共抽象方法,并让每个子类扩展它以执行特定的Seeker / Employer行为。这样你就不必担心你的子类型了。
一般情况下,如果您需要担心引擎盖下的对象类型(例如,哪个子类),这是一种设计气味,您应该考虑重构代码。
答案 1 :(得分:0)
假设TryLoad
实际上为您提供了JobSeeker
或Employer
的实例,是的,您可以这样做:
userRepository.TryLoad(userId, out user)
if (user is JobSeeker)
{
var jobSeeker = (JobSeeker)user;
//do some other stuff
} // etc
或者作为不同的样式并避免两次检查类型,请使用as
代替is
。
userRepository.TryLoad(userId, out user)
var jobSeeker = user as JobSeeker;
if (jobSeeker != null)
{
//do some other stuff
} // etc