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

本文关键字:属性 另一个 访问 调用 Func 中的 IDataReader | 更新日期: 2023-09-27 17:57:06

我只有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;
            }
        }
    }

然后我有一个用于数据检索的模型道,如下所示

            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"])
     }

这就是我遇到问题的地方,因为读者只识别护送模型,而不是地址(联系人)。 因为消息会说第一次机会例外 有关如何访问该地址属性的任何提示 护送模型 或者无论如何,地址(联系人)可以被所有其他模型所隐蔽,我已经查看了模型被所有人所隐患 根据所有模型,据我所知,C#不允许多重继承。 谢谢。

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

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

看起来您已经模糊了模型和视图模型之间的界限,这就是导致您混淆的原因。

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

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

希望这有所帮助,如果我能澄清任何事情,请告诉我!