2014-11-02 56 views
-1

我有以下類:轉換派生類屬性至基礎,使通用方法

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; 
    } 
} 

我有其他類顯示實體類型。我想要寫在類中顯示任何entities.I的數據的通用方法已經實現了類/方法如下:

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(); 

但是代碼無法顯示實體的數據。我可以如何編寫一個通用方法來將任何實體類型傳遞給方法?

+1

爲什麼仿製藥?只需在'EntityBase'中添加一個抽象方法即可。 – Rotem 2014-11-02 16:48:14

+0

我什至不知道這個代碼如何編譯。語句'dispEntity.entity = emp;'應該會導致編譯時錯誤,因爲'entity'字段的類型爲'EntityDataBase',而'emp'變量的類型爲'Employee',它不是'EntityDataBase'或者一個從該類派生的類型。在任何情況下,Rotem的建議都是正確的答案:在這裏你不需要泛型方法(並且你確實不需要反射),你只需要在基類中添加一個抽象方法,這樣每個子類就可以實現適當的'一些顯示機制'適合每個。 – 2014-11-02 17:36:07

回答

0

您可以使用反射來獲取對象的公共屬性。這裏是一個例子:

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))); 
} 
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)您顯示員工數據。

但是數據總是相同的 - 它總是關於新創建的員工的信息。其次,在步驟1和3中創建Employee。但第一步中的人從未實際使用過。在您的解決方案中,您只能訪問在第三步中創建的員工。

也許值得重新考慮設計和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()); 
    } 
}