なぜ私はC#の値に "this"を設定できないのですか?

c# dapper dapper-extensions

質問

私はDapper.net Extensionsを使用しています。私は写真オブジェクトを取得し、それぞれのプロパティを個別に設定することなく 'this'を設定できるようにしたいと考えています。これを達成する最良の方法は何でしょうか?下のコードでは、読み込み専用であるため、「this」に割り当てることはできません。

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

受け入れられた回答

残念ながら、プロパティを設定せずにこれを行う方法はありません。これを行うためのエレガントな方法は、静的メソッドを使用して写真を読み込むことです。私はあなたが使用している拡張子を持っていないので、次のコード例は少し異なりますが、例として動作するはずです。

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

トピックについてのJon Skeetからのより多くの議論がここにあります: http : //bytes.com/topic/c-sharp/answers/513887-cannot-assign-because-read-only


人気のある回答

できません。個別にメソッドをコピーする必要がありますが、リフレクションやAutoMapperなどのライブラリを使用すると、簡単に行うことができます。

つまり、私はより良い計画はLoad静的にし、それが新しいPhotoインスタンスを返すように思っています。これは.NET Framework 自体で最もよく見られるパターンです。

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow