我有以下课程:
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();
但代码无法显示实体的数据。如何编写通用方法将任何实体类型传递给方法?
答案 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中创建的。但是第一步的人从未真正使用过。在您的解决方案中,您只能访问在第三步中创建的员工。
也许值得重新考虑设计以及EntityBase
和EntityDataBase
之间的关系?
话虽如此,如果你仍然希望你的课程以通用方式实现,下面是实现:
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());
}
}