为什么我不能将“this”设置为C#中的值?

时间:2013-08-17 04:25:16

标签: c# dapper dapper-extensions

我正在使用Dapper.net Extensions,我希望能够检索Photo对象并将'this'设置为它,而无需单独设置每个属性。实现这一目标的最佳方法是什么?在下面的代码中,它说我不能分配给'this',因为它只是readonly。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

this 只读 ...所以不,你不能这样做。

AutoMapper这样的框架用于对象之间的映射。也许你应该研究一下。

话虽如此......我认为你的设计可以使用重新思考。您已经达到了域对象自己加载数据的程度,并且您已经意识到您将编写重复的映射代码。我认为现在是时候把它提取到一个“服务”类中并完全从你的域对象中删除逻辑(从而使你的问题无效,因为你无论如何都不会遇到这种情况)。

答案 2 :(得分:2)

你不能,你必须单独复制方法,但是你可以使用像反射这样的方法或像AutoMapper这样的库来使它更容易。

话虽如此,我认为一个更好的计划是让Load为静态并让它返回一个新的Photo实例,这是您在.NET {{最常见的模式3}} framework

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