2012-12-19 43 views
1

我可以創建一個片段並讓它分析一個當前類,獲取所述類的屬性,然後創建一個sql函數,逐行寫出命令參數中的每個屬性。如何使用片段獲取當前類的屬性?

我所尋找的是做這樣的事情:

public static int Add(MyObject Message) { 
     MySqlConnection connection = new MySqlConnection(MySqlConnection); 
     MySqlCommand command = new MySqlCommand("Add_Message", connection); 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.AddWithValue("@IMFromUserID", Message.IMFromUserID); 
     command.Parameters.AddWithValue("@IMToUserID", Message.IMToUserID); 
     command.Parameters.AddWithValue("@IMMessage", Message.IMMessage); 
     command.Parameters.AddWithValue("@IMTimestamp", Message.IMTimestamp); 
     connection.Open(); 
     MySqlDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) { 
      Message.IMID = (int)reader["IMID"]; 
     } 
     command.Dispose(); 
     connection.Close(); 
     connection.Dispose(); 
     return Message.IMID; 
    } 

基本上我想要的片段來填充整個附加功能,並在@PropertyName填寫,並在command.Parameters.AddWithValue

回答

0

我不要了Message.PropertyName認爲code snippets足夠強大。也許ReSharper's code templates足夠強大,但我也不這麼認爲。如果您確實需要或希望生成代碼,則可以使用T4 templates進行研究。

我個人建議避免編譯時代碼的產生。您可以使用反射 - 簡單但速度慢 - 或運行時代碼生成 - 複雜但快速。如果表現不是主要問題,我建議使用反思。

public static Int32 Add<TMessage>(TMessage message) 
    where TMessage: IMessageWithIMID 
{ 
    using (var connection = new MySqlConnection(connectionString)) 
    using (var command = new MySqlCommand("Add_Message", connection)) 
    { 
     command.CommandType = CommandType.StoredProcedure; 

     // We look only at public instance properties but you can easily 
     // change this and even use a custom attribute to control which 
     // properties to include. 
     var properties = typeof(TObject).GetProperties(BindingFlags.Public | 
                 BindingFlags.Instance); 

     foreach (var property in properties) 
     { 
      var parameterName = "@" + property.Name; 

      var value = property.GetValue(message, null); 

      command.Parameters.AddWithValue(parameterName, value); 
     } 

     connection.Open(); 

     message.IMID = (Int32)command.ExecuteScalar(); 

     return message.IMID; 
    } 
} 

請注意,您必須引進和實施,以訪問屬性IMID接口IMessageWithIMID

internal interface IMessageWithIMID 
{ 
    Int32 IMID { get; set; } 
} 

注意,你也不需要數據讀取 - 你可以只使用ExecuteScalar()。這將打開

using (var reader = command.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     message.IMID = (Int32)reader["IMID"]; 
    } 
} 

message.IMID = (Int32)command.ExecuteScalar(); 

和你做。

+0

奇怪的是,這實際上對我很好。我正在尋找開始爲應用程序構建基礎框架,這將幫助我開始。基本上我想要一個CRUD模板,但如果我使用泛型,那麼應該給我我想要的。 – meanbunny

相關問題