【问题标题】:Why in this architecture 'Map' function can't infer the map datatype?为什么在这个架构中的“地图”功能不能推断地图数据类型?
【发布时间】:2016-07-05 18:20:53
【问题描述】:

'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&lt;Usuario&gt;(); 而不是 usuario.Map();?无法推断?

【问题讨论】:

  • 没有。您将如何期望推断类型参数?编译器应该如何知道您打算使用任何特定类型?仅仅因为usuarioUsuario 类型,并不意味着唯一的逻辑类型参数是Usuario。您也可以使用派生自Repository 并具有无参数构造函数的 any 其他类型。

标签: c# .net inheritance


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多