如何从C#中的IDataReader Func调用的另一个类属性中访问类属性

时间:2014-04-05 18:07:10

标签: c# wpf mvvm

我有1年的经验,所以请温柔的对我:) 我目前正在学习MVVM,而我正在关注我在网上找到的一个例子。 我试图定制它来做我想要它做的事情。 我有4个类(模型),处理司机,学生车等 我决定创建一个联系类模型,应该在所有模型中共享。

我有一个DataAccess类,使用以下方法从数据库中读取

 public static List<T> ReadList<T>(string sql, Func<IDataReader, T> makeDataObject,
       Dictionary<string, object> parms = null)
    {
        using (var connection = factory.CreateConnection())
        {
            connection.ConnectionString = connectionString;
            using (var command = factory.CreateCommand())
            {
                command.Connection = connection;
                command.CommandText = sql;
                command.SetParameters(parms);

                connection.Open();

                List<T> list = new List<T>();
                var reader = command.ExecuteReader();
                while (reader.Read())
                {
                    list.Add(makeDataObject(reader));
                }

                return list;
            }
        }
    }

然后我有一个ModelDao用于数据检索,如下所示

            public static List<EscortModel> GetEscorts()
    {
        //string sql = @"SELECT EscortId, FirstName From tb_Escorts; select * from tb_Addresses ";
        string sql = @"SELECT AddressID,EscortId, FirstName From tb_Escorts
            inner join tb_Addresses on tb_Escorts.EscortId = tb_Addresses.AddressID ";
        return AdoDataAccess.ReadList(sql, MakeDataObject);
    }


private static Func<IDataReader, EscortModel> MakeDataObject = reader =>
           new EscortModel
           {
              // AddressesEscort1 = {}

               //AddressesEscort1 = { AddressId = reader.GetInt32(302) },
               EscortId = Convert.ToInt32(reader["EscortID"]),
               FirstName = reader["FirstName"].ToString().Trim(),
            }

及以下是包含地址模型的类模型的一部分:

    public class EscortModel:ViewModel
{
    #region Fields
    private int _iEscortId;
    private string _sFirstName;
    private string _sSurname;
    private bool _bCrbCheck;
    private string _sCrbRef;
    private DateTime _expirayDate;
    private bool _bTraining;
    private string _sTrainingType;
    private Addresses _escAddressesModel;
    #endregion Fields

    public Addresses AddressesEscort1
    {
        get { return _escAddressesModel; }
        set
        {
            _escAddressesModel = value;
            NotifyPropertyChanged();
        }
    }
    #region Properties

    /// <summary>
    /// Get or set Escort ID
    /// </summary>
    public int EscortId
    {
        get { return _iEscortId; }
        set
        {
            _iEscortId = value;
            NotifyPropertyChanged();
        }
    }

当我尝试访问任何地址属性时,我的问题如下

private static Func<IDataReader, EscortModel> MakeDataObject = reader => New EscortModel
     {
        EscortModel.Addresses.AddressID = Convert.ToInt32(reader["AddressID"])
     }

这就是我遇到问题的地方,因为阅读器只重新设置了EscortModel而不是地址(联系人)。          因为消息会说首先例外          有关如何在EscortModel中访问该地址属性的任何提示          或者无论如何,地址(联系)可以被所有其他模型继续存在,记住我已经viewModel是所有人的iherited          通过所有模型,据我所知,C#不允许多重继承。          谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我想我现在明白你的问题了:

看起来你已经模糊了Model和ViewModel之间的界限,这就是导致你混淆的原因。

您的数据对象(本例中为Escort)不应继承自ViewModel(因为它们是Model的一部分)。相反,他们会继承基地&#34;联系人&#34;如你所描述的那样。当然,如果你不是&#34;&#34;类型的&#34;情况,你不应该使用继承。在这种情况下,组合是你需要的。为了减少重复的代码,我将创建一个代表所有常见信息的ContactInfo类,并让每个类都具有这种新类型的属性。

实际的&#34; ViewModel&#34; (这是每个视图一个类)然后将整理这些对象以供View使用,并且不应包含特定于模型的任何数据。

希望这有帮助,让我知道我是否可以澄清任何事情!