繁体   English   中英

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

[英]How can i access a class properties from within another one called from a IDataReader Func in C#

我只有1年的经验,所以请对我保持冷静:)我目前正在学习MVVM,我在跟踪我在网上发现的一个示例。 我试图定制它来做我想做的事。 我有4个用于处理驾驶员,学生汽车等的类(模型),因此我决定创建一个应在所有模型之间共享的联系类模型。

我有一个使用以下方法从数据库读取数据访问类

 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();
        }
    }

我尝试从以下位置访问任何Adresses属性时遇到的问题

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

那就是我遇到问题的地方,因为读者仅能识别EscortModel,而不能识别地址(联系人)。 因为该消息将表示优先机会异常,因此关于如何访问EscortModel中的Addresses属性的任何提示,或者无论如何,所有其他模型都可能会继承Addresses(联系人),我已经牢记所有模型都继承了viewModel据我所知,C#不允许多重继承。 谢谢。

好的,我想我现在已经理解您的问题:

看起来您已经模糊了Model和ViewModel之间的界线,这就是造成您困惑的原因。

您的数据对象(在这种情况下为Escort)不应从ViewModel继承(因为它们是Model的一部分)。 而是,它们将从您描述的基本“联系人”类继承。 当然,如果您不处于“类型”的情况,则无论如何都不应使用继承。 在这种情况下,您需要组合。 为了减少重复的代码,我将创建一个ContactInfo类,该类代表所有公共信息,并让每个类具有此新类型的属性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM