将派生类属性转换为Base以生成泛型方法

时间:2014-11-02 16:43:58

标签: c#

我有以下课程:

public abstract class EntityBase
{

}

public class Employee:EntityBase
{
   public string Name {get;set}
   public string Address {get;set}  

}

public class Salary:EntityBase
{
   public int Basic {get;set}
   public int DA {get;set}  

}

我有另一个类/方法来返回实体数据作为基本类型:

public abstarct class EntityDataBase
{
   EntityBase GetEntityData();

}

public class EmployeeData:EntityDataBase
{

   EntityBase GetEntityData()
   {
      Employee emp=new Employee();
      return emp;
   }
 }  

public class SalaryData:EntityDataBase
{

   EntityBase GetEntityData()
   {
      Salary sal=new Salary();
      return sal;
   }
 }  

我有另一个显示实体类型的类。我想在类中编写一个泛型方法来显示任何实体的数据。我已经实现了类/方法如下:

public class DisplayEntities
{ 
  public EntityDataBase entityData {get;set}
  public EntityDataBase entity {get;set}
  public DisplayData()
  {
    entity =  entityData.GetEntityData(); 
    //Display Data using some display mechanism
  } 

 }

我正在使用客户代码中的代码:

 Employee emp = new Employee();
 EmployeeData empData = new EmployeeData();
 DisplayEntities dispEntity= new DisplayEntities();
 dispEntity.entityData =  empData;
 dispEntity.entity= emp;
 dispEntity.DisplayData();

但代码无法显示实体的数据。如何编写通用方法将任何实体类型传递给方法?

2 个答案:

答案 0 :(得分:0)

您可以使用Reflection获取对象的公共属性。这是一个例子:

EntityBase entity = new Employee();
var properties = entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var  property in properties)
{
    Console.WriteLine(string.Format("Name = {0}, Value = {1}",
        property.Name,
        property.GetValue(entity)));
}

答案 1 :(得分:0)

问题在于您没有通过显示实体数据来定义您理解的内容。是否要显示对象的描述,属性列表,内存消耗?

如果您希望您的实体显示有关该对象的一些基本信息,那么您可能应该在子类的级别上实现该机制(即在继承自EntityBase的任何类的级别上执行此操作)。要确保每个派生类都实现此方法,您应该在父类中将DisplayData方法标记为abstract。说,像这样:

public abstract class EntityBase
{
    public abstract string DisplayData();
}

然后,从EntityBase派生的任何类都必须实现DisplayData

public class Employee : EntityBase
{
    public string Name { get; set; }
    public string Address { get; set; }

    public string DisplayData()
    {
        return string.Format("Name: {0}; Address: {1}", this.Name, this.Address);
    }
}

现在您可以使用该方法的结果。

对于你的DisplayEntities课程,我没有看到你按照你的方式实施课程的重点。看看会发生什么:1)你创建一个新的Employee; 2)员工被转到DisplayEntities班; 3)在DisplayEntities课程中,您调用GetEntityData,创建另一个新的Employee; 4)您使用在步骤3中创建的新员工覆盖步骤1中的员工; 5)您显示员工数据。

但数据总是一样的 - 它始终是关于新创建的员工的信息。其次,Employee是在步骤1和3中创建的。但是第一步的人从未真正使用过。在您的解决方案中,您只能访问在第三步中创建的员工。

也许值得重新考虑设计以及EntityBaseEntityDataBase之间的关系?

话虽如此,如果你仍然希望你的课程以通用方式实现,下面是实现:

public class DisplayEntities<T, K>
    where T : EntityDataBase
    where K : EntityBase
{
    public T entityData { get; set; }
    public K entity { get; set; }
    public void DisplayData()
    {
        entity = (K)entityData.GetEntityData();

        Console.WriteLine(entity.DisplayData());
    }
}