2013-10-16 66 views
0

我正在開發一種服務來收集來自許多遠程數據庫的數據並將其編譯到主數據庫。我有一個接口,其中包含兩個數據庫之間通用的數據。該接口也可以作爲我的Model和ViewModel之間的鏈接。在構造函數中使用反射和接口來初始化C#

我想從RemoteDatabase的一個實例中獲取數據,並將所有這些數據放入MasterDatabase的一個實例中。

public interface IInterface 
{ 
    //Common interface properties in both databases 
    long PK { get; set; } 
    Nullable<long> RUN_ID { get; set; } 
    string Recipe_Name { get; set; } 
    string Notes { get; set; } 
    //Lots more properties from a database 
} 

class RemoteDatabase : IInterface 
{ 
    //Common interface properties in both databases 
    public long PK { get; set; } 
    public Nullable<long> RUN_ID { get; set; } 
    public string Recipe_Name { get; set; } 
    public string Notes { get; set; } 
    //Lots more properties from a database 
} 

class MasterDatabase : IInterface 
{ 
    //Additional properties that Remote Database doesn't have 
    public int locationFK { get; set; } 

    //Common interface properties from database 
    public long PK { get; set; } 
    public Nullable<long> RUN_ID { get; set; } 
    public string Recipe_Name { get; set; } 
    public string Notes { get; set; } 
    //Lots more properties from a database 

    public MasterDatabase(IInterface iInterface) 
    { 
     var interfaceProps = typeof(IInterface).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo p in interfaceProps) 
     { 
      p.Name; 
     } 
    } 
} 

我想只投的對象,而是提供了一個無效轉換異常,我的理解(雖然他們有共同的祖先,這並不意味着他們可以施放狗==動物,魚類動物== ,但狗!=魚,但我想要的是獲得在IAnimal中定義的共同屬性)。

由於無法投射,我想使用反射,以便如果界面更新,則MasterDatabase類中的所有新對象都將自動更新。我使用反射來獲取界面中的所有屬性,但是現在如何使用propertyInfo.name來獲取MasterDatabase類中的值。

也許我錯過了一些明顯的東西,或者有更好的方法來做到這一點。我感謝任何幫助或建議。

預先感謝您。

+0

你有沒有考慮automapper:您傳遞的值應該使用在構造函數的參數對應的GetValue調用來檢索? http://visualstudiomagazine.com/articles/2012/2012/02/01/simplify-your-projections-with-automapper.aspx – Colin

回答

1

您需要在PropertyInfo對象上調用SetValue,使用this作爲目標。

foreach (PropertyInfo p in interfaceProps) 
{ 
    p.SetValue(this, p.GetValue(iInterface, null), null); 
} 
+0

謝謝你的幫助。我現在意識到後續問題。如果我有一個IEnumerable ,並且我想將它放入IEnumberable 中,我應該使用foreach嗎?隱式轉換器會對我更好嗎?感謝您的幫助,很多這些話題對我來說都是非常新的。 我會upvote你的答案,但不幸的是,我還沒有足夠的聲譽,所以謝謝你! –

+0

是的,在這種情況下,你會想要使用一個簡單的'for each'循環並手動映射每個元素。說實話,你會更好地使用像[AutoMapper](http://www.automapper.org) – rossipedia