如何在SqlDataReader上下文中使用属性?

时间:2017-06-05 21:13:48

标签: c# generics attributes sqldatareader

我正在尝试建立一个通用的SQL执行器。

如果我的DTO类属性与我的SQL表列具有相同的名称,则它正在工作。

为了增加我的代码的通用部分,我向DTO添加了一个属性,以便将我的DTO属性分离到SQL列。

但它不起作用

我的DTO课程:

public class CarModels
{
    [DbColumn("ca_id")] //column name
    public string Id { get; set; }

    [DbColumn("ca_label")]  //column name
    public string Label { get; set; }
}

我的通用方法:

    public List<T> ExecuteSQLSELECTCommand<T>(string SQLcommand) where T : new()
    {
        IDictionary<string, string> databaseMappings = new Dictionary<string, string>(); ;

        Get_Connection();
        using (MySqlCommand cmd = new MySqlCommand())
        {

            cmd.Connection = connection;
            cmd.CommandText = string.Format(SQLcommand);
            List<T> res = new List<T>();
            try
            {
                MySqlDataReader reader = cmd.ExecuteReader();

                 while (reader.Read())
                  {
                    T t = new T();

                    for (int inc = 0; inc < reader.FieldCount; inc++)
                    {   

                            Type type = t.GetType();
                         //how to get attribute link to current FiedCount ? 
                            PropertyInfo prop = type.GetProperty(reader.GetName(inc));
                            prop.SetValue(t, reader.GetValue(inc), null);                  

                    }
                    res.Add(t);
                }

                reader.Close();
            }
            catch (Exception e)
            {

            }
            return res;
        }
    }

和我的电话:

List<CarModels> carTest = db.ExecuteSQLCommand<CarModels>("SELECT ca_id, ca_label from cartracker.ca_cars");

我的问题是,我如何恢复属性的值以便在MySqlDataReader上下文中构建PropertyInfo?

感谢。

1 个答案:

答案 0 :(得分:0)

你可以使用这样的类。你能告诉我它是否有帮助:

public class AnEntity<T> where T : class, new()
{
    public T AnEntity(string[] token, ref int i, out TokenEnum tokenEnum,
                                        out string tokenException)
    {
       ...
        PropertyInfo[] properties = typeof(T).GetProperties();
        try
        {
            foreach (PropertyInfo property in properties)
            {
                ...
                    if (property.Name == "AName") 
                    {
                        break;
                    }
...