¿Por qué no puedo configurar "esto" a un valor en C #?

c# dapper dapper-extensions

Pregunta

Estoy usando las extensiones de Dapper.net y me gustaría poder recuperar un objeto de foto y ponerle 'esto' sin tener que configurar cada propiedad individualmente. ¿Cuál sería la mejor manera de lograr esto? En el siguiente código dice que no puedo asignar 'esto' porque es de solo lectura.

public class Photo
{
    public Int32 PhotoId { get; set; }
    public Guid ObjectKey { get; set; }
    public Int16 Width { get; set; }
    public Int16 Height { get; set; }
    public EntityObjectStatus ObjectStatus { get; set; }
    public PhotoObjectType PhotoType { get; set; }
    public PhotoFormat2 ImageFormat { get; set; }
    public Int32 CategoryId { get; set; }

    public Photo(int pPhotoId)
    {
        Load(pPhotoId);
    }

    public void Load(int pPhotoId)
    {
        using (SqlConnection conn = new SqlConnection(Settings.Conn))
        {
            conn.Open();
            this = conn.Get<Photo>(pPhotoId);
        }
    }
}

Respuesta aceptada

Lamentablemente, no hay forma de hacerlo sin configurar las propiedades. Una forma elegante de hacer esto sería usar un método estático para cargar la foto. No tengo la extensión que está utilizando, por lo que el siguiente ejemplo de código es un poco diferente, pero debería funcionar como un ejemplo.

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    public class Photo
    {
        public Int32 PhotoId { get; set; }
        public Guid ObjectKey { get; set; }
        public Int16 Width { get; set; }
        public Int16 Height { get; set; }
        public Int32 CategoryId { get; set; }

        public static Photo Load(int id)
        {
            using (SqlConnection conn = new SqlConnection("ABC"))
            {
                return conn.Get<Photo>(id);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Photo photo = Photo.Load(1);
        }
    }
}

Algunos más discusión aquí de Jon Skeet sobre el tema: http://bytes.com/topic/c-sharp/answers/513887-cannot-assign-because-read-only


Respuesta popular

No puede, debe copiar los métodos individualmente, sin embargo, puede usar métodos como la reflexión o una biblioteca como AutoMapper para que sea más fácil hacerlo.

Dicho esto, creo que un plan mejor es hacer que Load estático y hacer que devuelva una nueva instancia de Photo , este es el patrón que se ve más a menudo en el propio framework .NET .

public static Photo Load(int pPhotoId)
{
    using (SqlConnection conn = new SqlConnection(Settings.Conn))
    {
        conn.Open();
        return conn.Get<Photo>(pPhotoId);
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow