向泛型函数传递参数

本文关键字:参数 函数 泛型 | 更新日期: 2023-09-27 18:16:56

我看了一下,我的知识水平似乎不足以解决这个问题。我正在尝试创建一个方法,它将对运行时不知道类型的对象做一些事情。我知道泛型可以解决我的问题。

这是我目前拥有的,它可以工作。两个不同的对象,但具有相同的属性,因此源属性被复制到目标:

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;
}

我如何调用这个方法,我如何传递它的源和目标,以便它返回具有复制属性的对象。

我试过这个(和更多的例子):

CloneObjectProperties((dynamic)source, (dynamic)destination);

但是这些都不起作用。如有任何见地,不胜感激:)

向泛型函数传递参数

您肯定希望源和目标是不同的类型吗?

private static object CloneObjectProperties<TSource,TDestination>(TSource source, TDestination destination)

然后就叫它

CloneObjectProperties(source, destination);

Also: AutoMapper已经这样做了!

为源和目标使用不同的类型,并且将返回类型更改为目标类型可能也很有用。

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)