我看过,似乎我的知识水平不足以解决这个问题。 我正在尝试创建一个方法,它将对运行时未知类型的对象执行某些操作。我知道泛型是我的任务的解决方案。
这是我现在拥有的,它的工作原理。两个不同的对象,但具有相同的属性,因此源属性被复制到destinaiton:
var source = dbContext.tbl_person.FirstOrDefault(item => item.PersonID == parameters.PersonID);
tbl_personHistory destination = new tbl_personHistory();
//Copy the properties
PropertyInfo[] destinationProperties = destination.GetType().GetProperties();
foreach (PropertyInfo destinationPi in destinationProperties)
{
PropertyInfo sourcePi = source.GetType().GetProperty(destinationPi.Name);
destinationPi.SetValue(destination, sourcePi.GetValue(source, null), null);
}
然后我试着把它变成一个方法,所以我可以在很多其他地方使用它:
private static object CloneObjectProperties<T,T>(T source, T destination)
{
PropertyInfo[] destinationProperties = destination.GetType().GetProperties();
foreach (PropertyInfo destinationPi in destinationProperties)
{
PropertyInfo sourcePi = source.GetType().GetProperty(destinationPi.Name);
destinationPi.SetValue(destination, sourcePi.GetValue(source, null), null);
}
return destination;
}
如何调用此方法,如何传递源和destion,以便返回具有复制属性的对象。
我试过这个(以及更多例子):
CloneObjectProperties((dynamic)source, (dynamic)destination);
但它都不起作用。任何见解都表示赞赏:)
答案 0 :(得分:1)
当然,您希望源和目标是不同的类型吗?
private static object CloneObjectProperties<TSource,TDestination>(TSource source, TDestination destination)
然后你只需将其称为
CloneObjectProperties(source, destination);
另外:AutoMapper已经这样做了!
答案 1 :(得分:1)
为源和目标使用不同的类型,将返回类型更改为目标类型可能也很有用。
private static TDestination CloneObjectProperties<TSource, TDestination>(TSource source, TDestination destination)
{
PropertyInfo[] destinationProperties = destination.GetType().GetProperties();
foreach (PropertyInfo destinationPi in destinationProperties)
{
PropertyInfo sourcePi = source.GetType().GetProperty(destinationPi.Name);
destinationPi.SetValue(destination, sourcePi.GetValue(source, null), null);
}
return destination;
}
由于您不使用源类型,因此可以将方法签名更改为:
private static TDestination CloneObjectProperties<TDestination>(object source, TDestination destination)