繁体   English   中英

将参数传递给泛型函数

[英]Passing parameters to generic function

我已经看过了,看来我的知识水平不足以解决这个问题。 我正在尝试创建一种方法,它将对运行时未知类型的对象执行某些操作。 我确实知道仿制药是我追求的解决方案。

这是我目前拥有的并且可以正常工作。 两个不同的对象,但是具有相同的属性,因此将源属性复制到目的地:

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

另外: 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM