我正在尝试使用泛型来提高自己,但实际上我不知道如何开始这项任务:
我需要构建一个记录两个带日志的表的方法。这个方法将收到两个相同类型的对象,然后我需要对它们进行比较。
将使用对象的名称记录第一个表。
第二个表将收到以下数据:第一个表记录ID,字段名称,旧值和新值。
我需要使用泛型来构建,因为我有很多不同的对象,而且我确信为每个想要记录这些信息的对象构建任何类型的switch case都会很痛苦和奇怪。
我希望你们能帮助我!
答案 0 :(得分:1)
除非这些对象共享一个公共接口,否则你必须使用反射来获取对象的属性,然后遍历它们并比较objectA和objectB之间的值。像这样:
public void CompareTwoObjectsAndSaveChanges<TObjectType>(TObjectType objectA, TObjectType objectB )
{
//makes sure both objects match in Type
if(objectA.GetType() == objectB.GetType())
{
//uses reflection to get all the properties of that object.
foreach (var prop in objectA.GetType().GetProperties())
{
//checks to see if the value is different
if(prop.GetValue(objectA, null) != prop.GetValue(objectB, null))
{
//get the property name and its two different values
string nameOfPropertyThatChanges = prop.Name;
string objectAValue = prop.GetValue(objectA, null).ToString();
string objectBValue = prop.GetValue(objectB, null).ToString();
//logic to save to database
}
}
}
}
您必须在数据库中将oldValue和newValue列设置为varchar或nvarchar,并在保存之前将所有属性值转换为字符串,否则您无法按照要求执行操作。从技术上讲,你甚至不必在这里使用泛型,因为两个参数都可以简单地获取一个对象,并且反射仍然可以工作,因为两个对象都是相同的类型。这里的泛型参数只是让它更干净,并确保调用此方法的人不会意外地传入两个不同类型的对象。
编辑:要获取第一个表格的对象名称,您可以这样做:
typeof(TObjectType).ToString();