2013-11-27 83 views
0

對不起,如果標題不反映我真正想要的。如何在給對象作爲參數時賦值給屬性類?

我正在創建一個通用類,用於選擇,更新,插入和刪除數據庫中的日期。

基本上,我想要一個函數,讓我回到ObservableCollection <「可以是任何東西」> ==>凡什麼是類而不是字符串。我想知道是否有可能做到這一點,如果是的話,請幫助我如何做到這一點。

這是我的出發點:

//類

public static ObservableCollection<ContactPerson> contactPersons = new ObservableCollection<ContactPerson>(); 

    public static ObservableCollection<ContactPerson> getContactPerson() 
    { 
     contactPersons = (ObservableCollection<ContactPerson>)DBConnection.GetDataOutDatabase(typeof(ContactPerson), "Contactpersoon"); 

     return contactPersons; 
    } 

// b類

 public static Object GetDataOutDatabase(Type myType,String table) 
    {    
     ObservableCollection<Object> objecten = new ObservableCollection<Object>(); 

     string sql = "SELECT * FROM " + table; 
     DbDataReader reader = Database.GetData(sql); 

     while (reader.Read()) 
     { 
      objecten.Add(Create(myType, reader)); 
     } 

     return objecten; 
    } 

    private static Object Create(Type myType, IDataRecord record) 
    { 
     PropertyInfo[] myPropertyInfo = myType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     for (int i = 0; i < myPropertyInfo.Length; i++) 
     { 
      PropertyInfo myPropInfo = (PropertyInfo)myPropertyInfo[i]; 
      String name = myPropInfo.Name; 
      Type type = myPropInfo.PropertyType; 
     } 

     return null; 
    } 

而這就是我最終想要得到的。這可能嗎?

 //ContactPerson cp = new ContactPerson(); 
     //cp.ID = (record["ID"].ToString()); 
     //cp.Name = record["Name"].ToString(); 
     //cp.Company = record["Company"].ToString(); 
     //cp.JobTitle = new ContactPersonTitle() 
     //{ 
     // Name = record["JobTitle"].ToString(), 
     //}; 
     //cp.JobRole = new ContactPersonType() 
     //{ 
     // Name = record["JobRole"].ToString(), 
     //}; 
     //cp.City = record["City"].ToString(); 
     //cp.Email = record["Email"].ToString(); 
     //cp.Phone = record["Phone"].ToString(); 
     //cp.Cellphone = record["Cellphone"].ToString(); 

非常感謝!

回答

0

實際上,你可以用普通的方法反映這一點。

public class DBConnection 
{ 
    public static ObservableCollection<T> GetDataOutDatabase<T>(string table) 
    { 
     var objecten = new ObservableCollection<T>(); 
     string sql = "SELECT * FROM " + table; 
     DbDataReader reader = Database.GetData(sql); 

     while (reader.Read()) 
     { 
      objecten.Add(Create<T>(reader)); 
     } 
     return objecten; 
    } 

    public static T Create<T>(IDataRecord record) 
    { 
     var properties = typeof(T).GetProperties(); 
     var returnVal = Activator.CreateInstance(typeof(T)); 
     properties.ToList().ForEach(item => 
      { 
       try 
       { 
        if (item.PropertyType.IsPrimitive) 
        { 
         item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), item.PropertyType),null); 
        } 
        else 
        { 
         object[] parameters = {record}; 
         var value = 
         typeof(DBConnection).GetMethod("Create").MakeGenericMethod(item.PropertyType).Invoke(null, parameters); 
         item.SetValue(returnVal,value,null); 
        } 
       } 
       catch 
       { 
        Write("Property Not Found"); 
       } 
      }); 
     return (T)returnVal; 
    } 
} 

上面的例子假設所有屬性名稱都與您從數據庫通信中檢索的列名稱匹配。例如在上面的ContactPersonTitle而不是Name中,您需要將JobTitle作爲屬性名稱。

+0

我想這代碼,它在這部分崩潰 properties.ToList()的ForEach(項目=> 了var屬性,我得到的所有屬性和returnVal設置空 – denderp

+0

每個值我認爲問題出事實上我有2個屬性,我不想用這個函數,我試圖去掉var屬性的一些屬性,但是沒有.remove函數,它可以是這樣的問題,所以是的我如何從var屬性中刪除索引,如果它等於我指定的類型? – denderp

+0

在這種情況下,我會將if語句包裝在properties.tolist linq表達式中的try catch塊中,如果您不想吞下異常我會建議簡單地記錄它,這將允許你使用的屬性被設置,而你不屬於的屬性將保持爲空,而不是n試圖從列表中排除屬性 – theDarse