为什么在这个架构中,地图'函数无法推断地图数据类型?

时间:2016-07-05 18:20:54

标签: c# .net inheritance

' Usuario'它是一个带有一些属性的简单类。 Map是一个通用函数,我想在其他子句中使用它,例如' Usuario':

   public abstract class Repository : IRepository
    {
        public TEntity Map<TEntity>() where TEntity : Repository, new()
        {
            TEntity clone = new TEntity();
            PropertyInfo[] objProperties = this.GetType().GetProperties();

            foreach (PropertyInfo pi in objProperties)
            {
                if (pi.PropertyType.IsPrimitive ||
                            pi.PropertyType.FullName.Contains("System.Int") || //when int primitives are nullables it's needed
                            pi.PropertyType.FullName.Contains("System.DateTime") ||
                            pi.PropertyType.FullName.Contains("System.Decimal") ||
                            pi.PropertyType.FullName.Contains("System.Float") ||
                            pi.PropertyType.FullName.Contains("System.Double") ||
                            pi.PropertyType.FullName.Contains("System.String") ||
                            pi.PropertyType.FullName.Contains("System.Boolean") ||
                            pi.PropertyType.FullName.Contains("System.Byte") ||
                            pi.PropertyType.FullName.Contains("System.Guid"))
                {
                    if (pi.CanWrite)
                    {
                        pi.SetValue(clone, pi.GetValue(this));
                    }
                }
            }

            return clone;
        }

    }

以下是用法:

// GET: api/Usuarios/5
        [ResponseType(typeof(Usuario))]
        public IHttpActionResult GetUsuario(int id)
        {
            Usuario usuario = db.Usuarios.Find(id);
            if (usuario == null)
            {
                return NotFound();
            }

            return Ok(usuario.Map<Usuario>());
        }

如果usuario var属于Usuario数据类型,为什么我需要放usuario.Map<Usuario>();而不是usuario.Map();?它不能被感染吗?

1 个答案:

答案 0 :(得分:1)

您无法通过返回类型推断类型,但是体系结构的轻微更改使您无需执行此操作,您需要使基类通用。

public abstract class Repository<TEntity> : IRepository 
    where TEntity : Repository<TEntity>, new()
{
    public TEntity Map()
    {
        TEntity clone = new TEntity();
        // (Snip)
        return clone;
    }
}

然后在Usuario中,您将从

更改它
public class Usuario : Repository

public class Usuario : Repository<Usuario>

你的用法变成了

[ResponseType(typeof(Usuario))]
public IHttpActionResult GetUsuario(int id)
{
    Usuario usuario = db.Usuarios.Find(id);
    if (usuario == null)
    {
        return NotFound();
    }

    return Ok(usuario.Map());
}

这称为curiously recurring template pattern