为什么可以';tI设置“;这个“;转换为C#中的值
本文关键字:转换 这个 设置 tI 为什么 | 更新日期: 2023-09-27 18:27:57
我正在使用Dapper.net扩展,我希望能够检索一个Photo对象并将其设置为"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框架中最常见的模式。
public static Photo Load(int pPhotoId)
{
using (SqlConnection conn = new SqlConnection(Settings.Conn))
{
conn.Open();
return conn.Get<Photo>(pPhotoId);
}
}
this
是只读。。。所以不,你不能那样做。
有像AutoMapper这样的框架用于对象之间的映射。也许你应该调查一下。
话虽如此。。我认为你的设计需要重新思考。您已经到了域对象自己加载数据的地步,并且意识到您将编写重复的映射代码。我认为是时候将其提取到一个"Service"类中,并从域对象中完全删除逻辑了(从而使您的问题无效,因为您无论如何都不会遇到这种情况)。