我有一个道具List
在UserDAO中:
public User ReturnUser(int id)
{
var q = this.Users.Where(x => x.Id == id);
return q.ToList()[0];
}
主要:
User newUser = ud.ReturnUser(0);
Console.WriteLine(newUser.Name);
newUser.Name = "john";
Console.WriteLine(ud.Users[0].Name);
答案 0 :(得分:1)
如果您的User对象仅包含原始属性,则可以添加以下方法:
public User ShallowCopy(){
return (User)this.MemberwiseClone();
}
然后执行以下操作:
//note: no error handling if ID not found
public User ReturnUser(int id)
{
return this.Users.Single(x => x.Id == id).ShallowCopy();
}
如果您的用户包含复杂的类型属性,并且您不希望这些属性仅用作引用,则必须实现深层复制
The fine manual有足够多的话要说和一些很好的例子
答案 1 :(得分:1)
如果您只想参加第一场比赛,首先使用FirstOrDefault()
而不是Where()
。
其次,您可以返回结果的Clone:
public User ReturnUser(int id)
{
var q = this.Users.FirstOrDefault(x => x.Id == id);
return q?.MemberwiseClone();
}
答案 2 :(得分:0)
我认为AsNoTracking()
可能是您想要的方式。
public User ReturnUser(int id)
{
return this.Users.AsNoTracking().FirstOrDefault(x => x.Id == id);
}
此链接提供有关AsNoTracking()
的更多信息,但以上内容可以实现您想要实现的目标。
答案 3 :(得分:0)
尝试此操作,但是请注意,仅当您的用户对象仅包含基本类型(例如int,double,bool和不包含引用类型)时,此方法才有效。
有关Deep Copy / Deep Clone,请参见this
class Program
{
static void Main(string[] args)
{
var users = new List<User>()
{
new User()
{
Name = "My Name",
Job = new Job()
{
Title = "Developer"
}
}
};
var clonedUser = users[0].Clone();
clonedUser.Name = "My Updated Name";
clonedUser.Job.Title = "Graphic Designer"; //This Won't Work
Console.WriteLine(users[0].Name);
Console.WriteLine(users[0].Job.Title);
Console.ReadLine();
}
}
public class User
{
public string Name { get; set; }
public Job Job { get; set; }
public User Clone()
{
return (User) this.MemberwiseClone();
}
}
public class Job
{
public string Title { get; set; }
}