Pourquoi ne puis-je pas définir "this" sur C #?

c# dapper dapper-extensions

Question

J'utilise Dapper.net Extensions et je voudrais pouvoir récupérer un objet Photo et lui attribuer la valeur «this» sans avoir à définir chaque propriété individuellement. Quel serait le meilleur moyen d'y parvenir? Dans le code ci-dessous, il est dit que je ne peux pas attribuer "this" car il est en lecture seule.

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);
        }
    }
}

Réponse acceptée

Malheureusement, il n'y a aucun moyen de le faire sans définir les propriétés. Une façon élégante de le faire serait d'utiliser une méthode statique pour charger la photo. Je n'ai pas l'extension que vous utilisez, donc l'exemple de code suivant est un peu différent, mais cela devrait fonctionner comme exemple.

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);
        }
    }
}

Un peu plus de discussion ici de Jon Skeet sur le sujet: http://bytes.com/topic/c-sharp/answers/513887-cannot-assign-because-read-only


Réponse populaire

Vous ne pouvez pas, vous devez copier les méthodes individuellement, mais vous pouvez utiliser des méthodes telles que la réflexion ou une bibliothèque comme AutoMapper pour faciliter la tâche.

Cela étant dit, je pense qu'un meilleur plan est faire la Load statique et avoir retourner une nouvelle Photo par exemple, c'est le modèle que vous voyez le plus souvent dans le .NET cadre lui - même .

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi