2016-07-05 4 views
1

「Usuario」はいくつかのプロパティを持つシンプルなクラスです。 地図は、私が他の子に使いたいものを一般的な機能は、「Usuario」のようclasesされています。ここではこのアーキテクチャではなぜマップ機能がマップデータ型を推論できないのですか?

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場合usuario.Map<Usuario>();の代わりusuario.Map();を置く必要があるのはなぜvarはUsuarioデータ型ですか?それは推論することはできませんか?

+1

いいえ、あなたは*型パラメータが推測されることを*期待していますか?どのような特定の型を意図しているのか、コンパイラはどうやって考えていますか? 'usuario'が' Usuario'型であるからといって、唯一の論理型パラメータが 'Usuario'であることを意味するものではありません。 'Repository'から派生し、パラメータのないコンストラクタを持つ他の型を使うこともできます。 –

答えて

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<Usuario> 

public class Usuario : Repository 

からそれを変更しますし、あなたのuseageこれはと呼ばれる

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

    return Ok(usuario.Map()); 
} 

なり3210。

関連する問題