实体框架-使用泛型代码从C#中的另一个对象构建一个对象

本文关键字:一个对象 构建 代码 框架 泛型 实体 | 更新日期: 2023-09-27 17:58:54

假设我有一个User类型的对象,它看起来像这样:

User {
   Name = "Bob",
   Email = "Bob@gmail.com",
   Class = NULL
}

有人能想到一种方法来获取这个对象并创建这样的对象吗:

User {
   Name = "Bob",
   Email = "Bob@gmail.com"
}

完全使用通用代码?也就是说,我不想硬编码任何与类型或属性有关的内容,因为这段代码需要应用于我网站上的每个实体。(顺便说一句,"用户"类型是一个实体,所以如果它能帮助你更好地编码,请使用它)。

我只是想为我遇到的问题找到一个解决方案,我相信Stub实体可以解决这个问题,但我需要在不硬编码任何类型或属性的情况下完成它。

实体框架-使用泛型代码从C#中的另一个对象构建一个对象

使用反射来实现这一点:

public void CopyValues<TSource, TTarget>(TSource source, TTarget target)
{
    var sourceProperties = typeof(TSource).GetProperties().Where(p => p.CanRead);
    foreach (var property in sourceProperties)
    {
        var targetProperty = typeof(TTarget).GetProperty(property.Name);
        if (targetProperty != null && targetProperty.CanWrite && targetProperty.PropertyType.IsAssignableFrom(property.PropertyType))
        {
            var value = property.GetValue(source, null);
            targetProperty.SetValue(target, value, null);
        }
    }
}

Generics对这种情况没有帮助。实体框架中可能有一些选项,但我并不知道。

然而,使用"反射"是可能的。你可以试试这样的东西:

public static void CopyProperties(object a, object b)
{
    if (a.GetType() != b.GetType())
        throw new ArgumentException("Types of object a and b should be the same", "b")
    foreach (PropertyInfo property in a.GetType().GetProperties())
    {
        if (!property.CanRead || !property.CanWrite || (property.GetIndexParameters().Length > 0))
            continue;
        property.SetValue(b, property.GetValue(a, null), null);
    }
}

请记住,这需要您想要复制的所有属性同时具有公共setter和getter。此外,"深度复制"answers"浅层复制"之间也有区别,这意味着子对象是否也被复制或仅被引用。此示例将仅引用它们,因此它将是一个"浅拷贝"

这看起来像是反射而不是泛型的问题(尽管泛型可以作为缓存反射策略的一种狡猾方式)。除非我看错了,否则你想创建一个新实例并复制大多数成员。。。哪种反射很擅长,尽管相对较慢。您可以通过使用元编程来提高速度;在第一次运行时(按类型)生成一个优化的版本,可能使用DynamicMethod或Expression,并从中存储一个类型化的委托。然后使用委托即可。