如何从 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#不允许多重继承。 谢谢。
好的,我想我现在明白你的问题了:
看起来您已经模糊了模型和视图模型之间的界限,这就是导致您混淆的原因。
您的数据对象(在本例中为护送)不应从 ViewModel 继承(因为它们是模型的一部分)。相反,它们将继承您描述的基本"联系人"类。当然,如果您不处于"类型"情况,则无论如何都不应该使用继承。在这种情况下,构图就是您需要的。为了减少重复的代码,我将创建一个表示所有公共信息的ContactInfo
类,并让每个类都具有此新类型的属性。
然后,实际的"ViewModel"(每个视图一个类)将整理这些对象以供视图使用,并且不应包含特定于模型部分的任何数据。
希望这有所帮助,如果我能澄清任何事情,请告诉我!