0

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

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

3 に答える 3

3

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

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

于 2013-08-17T04:41:33.950 に答える
2

this読み取り専用です...いいえ、それはできません。

オブジェクト間のマッピングにはAutoMapperのようなフレームワークがあります。おそらくあなたはそれを調べるべきです。

そうは言っても..あなたのデザインは再考できると思います。ドメイン オブジェクト自体がデータをロードする段階に到達し、反復的なマッピング コードを記述することになることに気付きました。これを「サービス」クラスに抽出し、ドメインオブジェクトからロジックを完全に削除する時が来たと思います(とにかくそのような状況に遭遇することはないので、質問を無効にします)。

于 2013-08-17T04:37:06.047 に答える
2

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

そうは言っても、より良い計画はLoad静的にして新しいインスタンスを返すことだと思います。これは、 .NETフレームワーク自体Photoで最も頻繁に見られるパターンです。

public static Photo Load(int pPhotoId)
{
    using (SqlConnection conn = new SqlConnection(Settings.Conn))
    {
        conn.Open();
        return conn.Get<Photo>(pPhotoId);
    }
}
于 2013-08-17T04:37:37.350 に答える