我是否可以创建一个片段并让它分析当前类,获取所述类的属性,然后创建一个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
中的Message.PropertyName
和command.Parameters.AddWithValue
答案 0 :(得分:0)
我认为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;
}
}
请注意,您必须引入并实施接口IMessageWithIMID
才能访问属性IMID
。
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();
你已经完成了。