如何将数据行转换为通用模型 class?
How to convert datarow to generic model class?
我有很多模型 classes,我用 API.
中的数据填充
API 数据的结构是 DataRow。
对于每个 class,都有一个从 DataRow 到模型 class 的隐式转换。
我必须为每个模型编写一组函数 class。其中一个函数,从数据库中获取,对于所有模型 classes 都是通用的,所以我决定为此编写具有泛型类型的函数。
这里是模型的例子 class:
public class Person
{
public long Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public static implicit operator Person(DataRow dataRow)
{
if (dataRow != null)
{
return new Person
{
Id = long.Parse((string)dataRow["Id"]),
FirstName = (string)dataRow["FirstName"],
LastName = (string)dataRow["LastName"]
};
};
return null;
}
}
具有用于转换的通用类型的 class 示例,如下所示:
public class DefaultRepository<T>
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
T modelInstance = (T)Activator.CreateInstance(typeof(T));
modelInstance = (T)dataRow;
return modelInstance;
}
}
测试代码如下所示:
// for testing I will create DataTable and DataRow and populate it fake data
DataTable fakeTable = new DataTable();
fakeTable.Columns.Add("Id");
fakeTable.Columns.Add("FirstName");
fakeTable.Columns.Add("LastName");
DataRow fakeRow = fakeTable.NewRow();
fakeRow["Id"] = "1";
fakeRow["FirstName"] = "John";
fakeRow["LastName"] = "Doe";
// Cast DataRow to Pesron without error
Person fakePerson01 = (Person)fakeRow;
// Cant cast on this way create error while compiling
DefaultRepository<Person> defRepo = new DefaultRepository<Person>();
Person fakePerson02 = defRepo.CreateInstanceOfModelFromDataRow(fakeRow);
在第 modelInstance = (T)dataRow;
行编译“无法将类型 'System.Data.DataRow' 转换为 'T'”时出现错误
我也尝试 (T)Convert.ChangeType(dataRow, typeof(T));
,但没有成功。
是否可以进行这种转换?
由于您使用的是泛型,编译器不知道 T
是什么类型,因此您会遇到编译时错误。
您需要为您的通用实现添加约束 -
public class DefaultRepository<T> where T : Person
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
T modelInstance = (T)Activator.CreateInstance(typeof(T));
modelInstance = (T)dataRow;
return modelInstance;
}
}
也不需要通过反射创建实例。您可以将 dataRow 投射到您的 class -
public class DefaultRepository<T> where T : Person
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
var modelInstance = (T)dataRow;
return modelInstance;
}
}
我有很多模型 classes,我用 API.
中的数据填充
API 数据的结构是 DataRow。
对于每个 class,都有一个从 DataRow 到模型 class 的隐式转换。
我必须为每个模型编写一组函数 class。其中一个函数,从数据库中获取,对于所有模型 classes 都是通用的,所以我决定为此编写具有泛型类型的函数。
这里是模型的例子 class:
public class Person
{
public long Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public static implicit operator Person(DataRow dataRow)
{
if (dataRow != null)
{
return new Person
{
Id = long.Parse((string)dataRow["Id"]),
FirstName = (string)dataRow["FirstName"],
LastName = (string)dataRow["LastName"]
};
};
return null;
}
}
具有用于转换的通用类型的 class 示例,如下所示:
public class DefaultRepository<T>
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
T modelInstance = (T)Activator.CreateInstance(typeof(T));
modelInstance = (T)dataRow;
return modelInstance;
}
}
测试代码如下所示:
// for testing I will create DataTable and DataRow and populate it fake data
DataTable fakeTable = new DataTable();
fakeTable.Columns.Add("Id");
fakeTable.Columns.Add("FirstName");
fakeTable.Columns.Add("LastName");
DataRow fakeRow = fakeTable.NewRow();
fakeRow["Id"] = "1";
fakeRow["FirstName"] = "John";
fakeRow["LastName"] = "Doe";
// Cast DataRow to Pesron without error
Person fakePerson01 = (Person)fakeRow;
// Cant cast on this way create error while compiling
DefaultRepository<Person> defRepo = new DefaultRepository<Person>();
Person fakePerson02 = defRepo.CreateInstanceOfModelFromDataRow(fakeRow);
在第 modelInstance = (T)dataRow;
我也尝试 (T)Convert.ChangeType(dataRow, typeof(T));
,但没有成功。
是否可以进行这种转换?
由于您使用的是泛型,编译器不知道 T
是什么类型,因此您会遇到编译时错误。
您需要为您的通用实现添加约束 -
public class DefaultRepository<T> where T : Person
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
T modelInstance = (T)Activator.CreateInstance(typeof(T));
modelInstance = (T)dataRow;
return modelInstance;
}
}
也不需要通过反射创建实例。您可以将 dataRow 投射到您的 class -
public class DefaultRepository<T> where T : Person
{
public T CreateInstanceOfModelFromDataRow(DataRow dataRow)
{
var modelInstance = (T)dataRow;
return modelInstance;
}
}