在C#中将父对象转换为Child对象

时间:2014-04-24 16:58:19

标签: c# casting

假设我有一个父类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

http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

2 个答案:

答案 0 :(得分:1)

您可能需要考虑在User上创建一个公共抽象方法,并让每个子类扩展它以执行特定的Seeker / Employer行为。这样你就不必担心你的子类型了。

一般情况下,如果您需要担心引擎盖下的对象类型(例如,哪个子类),这是一种设计气味,您应该考虑重构代码。

答案 1 :(得分:0)

假设TryLoad实际上为您提供了JobSeekerEmployer的实例,是的,您可以这样做:

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