C# 通过将新对象指定给子实例来更新子对象
这应该是一个基本的C#问题。假设我有一个C# 通过将新对象指定给子实例来更新子对象,c#,entity-framework,C#,Entity Framework,这应该是一个基本的C#问题。假设我有一个p.Type==“Cat”); currentCat=更新的CAT; //Resharper为currentCat显示“分配的值未在任何执行路径中使用” //而且当前的cat从未更新过 Console.WriteLine(“\r\n尝试通过将新Cat分配给现有Cat来更新Cat后的设置状态(名称应为“Felix”,但不是):”; 列表宠物(myPerson); Console.ReadLine(); } 公共作废清单宠物(人) { foreach(var个
类,它包含一个名为
的属性,它是一个列表
如果我想更新宠物,我可以将宠物作为一个变量,并对其属性进行操作,但我似乎无法创建新的宠物对象并将其分配给现有的宠物对象。我得到一个“赋值不用于任何执行路径”警告。我创建了一些非常简单的代码来概述这个问题
在我的实际代码中,我希望能够使用新的子对象并替换现有的对象。如果您能告诉我如何使用下面的示例updatedCat做到这一点,我将不胜感激
class Program
{
static void Main(string[] args)
{
var program = new Program();
program.RunMe();
}
public void RunMe()
{
var myPerson = new Person() { Name = "John Doe" };
var dog = new Pet() { Type = "Dog", Name = "Woofie" };
var cat = new Pet() { Type = "Cat", Name = "Chester" };
myPerson.Pets.Add(dog);
myPerson.Pets.Add(cat);
Console.WriteLine("Initial Pet Status:");
ListPets(myPerson);
var currentDog = myPerson.Pets.SingleOrDefault(p => p.Type == "Dog");
currentDog.Name = "Snoopie";
Console.WriteLine("\r\nPet Status After Updating Dog Directly (name should be 'Snoopie'):");
ListPets(myPerson);
var updatedCat = new Pet() { Type = "Cat", Name = "Felix" };
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
currentCat = updatedCat;
//Resharper shows "Value assigned is not used in any execution path" for the currentCat
//and the current cat is never updated
Console.WriteLine("\r\nPet Status After Trying to Update Cat by Assigning a New Cat to existing Cat (name should be 'Felix' but it's not):");
ListPets(myPerson);
Console.ReadLine();
}
public void ListPets(Person person)
{
foreach (var pet in person.Pets)
{
Console.WriteLine(string.Format(" {0} has a {1} named {2}", person.Name, pet.Type, pet.Name));
}
}
}
public class Person
{
public string Name { get; set; }
public List<Pet> Pets { get; set; }
public Person()
{
Pets = new List<Pet>();
}
}
public class Pet
{
public string Type { get; set; }
public string Name { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
var program=新程序();
program.RunMe();
}
public void RunMe()
{
var myPerson=newperson(){Name=“John Doe”};
var dog=new Pet(){Type=“dog”,Name=“Woofie”};
var cat=new Pet(){Type=“cat”,Name=“Chester”};
myPerson.Pets.Add(狗);
myPerson.Pets.Add(cat);
Console.WriteLine(“初始宠物状态:”);
列表宠物(myPerson);
var currentDog=myPerson.Pets.SingleOrDefault(p=>p.Type==“Dog”);
currentDog.Name=“Snoopie”;
Console.WriteLine(“\r\n直接更新Dog后的设置状态(名称应为“Snoopie”):”;
列表宠物(myPerson);
var updatedCat=new Pet(){Type=“Cat”,Name=“Felix”};
var currentCat=myPerson.Pets.SingleOrDefault(p=>p.Type==“Cat”);
currentCat=更新的CAT;
//Resharper为currentCat显示“分配的值未在任何执行路径中使用”
//而且当前的cat从未更新过
Console.WriteLine(“\r\n尝试通过将新Cat分配给现有Cat来更新Cat后的设置状态(名称应为“Felix”,但不是):”;
列表宠物(myPerson);
Console.ReadLine();
}
公共作废清单宠物(人)
{
foreach(var个人宠物。宠物)
{
WriteLine(string.Format(“{0}有一个名为{2}的{1}”、person.Name、pet.Type、pet.Name));
}
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共列表宠物{get;set;}
公众人士()
{
Pets=新列表();
}
}
公营宠物
{
公共字符串类型{get;set;}
公共字符串名称{get;set;}
}
编辑以向Pet添加Id值并创建InsertOrUpdatePet方法
(注意:为了简洁起见,我删除了Console.Writeline命令)
类程序
{
静态void Main(字符串[]参数)
{
var program=新程序();
program.RunMe();
}
public void RunMe()
{
var myPerson=newperson(){Name=“John Doe”};
var dog=new Pet(){Id=1,Type=“dog”,Name=“Woofie”};
var cat=new Pet(){Id=2,Type=“cat”,Name=“Chester”};
myPerson.Pets.Add(狗);
myPerson.Pets.Add(cat);
var updatedCat=new Pet(){Id=2,Type=“Cat”,Name=“Felix”};
InsertOrUpdatePet(myPerson,updatedCat);
var currentCat=myPerson.Pets.SingleOrDefault(p=>p.Type==“Cat”);
}
公共作废插件更新宠物(个人,宠物)
{
var currentPet=person.Pets.SingleOrDefault(p=>p.Id==pet.Id);
if(currentPet==null)
{
person.Pets.Add(pet);
}
其他的
{
currentPet=pet;//这不起作用
person.Pets.SingleOrDefault(p=>p.Id==pet.Id)=pet;//这会抛出一个错误
}
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共列表宠物{get;set;}
公众人士()
{
Pets=新列表();
}
}
公营宠物
{
公共int Id{get;set;}
公共字符串类型{get;set;}
公共字符串名称{get;set;}
}
您需要移除要替换的宠物并添加新宠物
或者,你可以说
person.Pets[index] = new Pet() { Type = "Cat", Name = "Felix" };
其中index
是您要替换的宠物的索引
您不理解的是,Pet列表仅仅是对Pet实例的引用列表
获取对其中一个Pet实例的引用并将其存储在变量中,并将引用分配给Pet的新实例,不会更改列表中任何引用引用的引用位置。当然不是,您还没有在中修改列表。这就是为什么必须删除要替换的元素并添加新元素,或者直接将对新实例的引用指定给要替换的元素 这取决于你在概念上想做什么。如果你想说这个人摆脱了那只老猫,现在又有了一只新猫,你应该这样做:先移走那只老猫,然后移走那只新猫:
var updatedCat = new Pet() { Type = "Cat", Name = "Felix" };
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
myPerson.Remove(currentCat);
myPerson.Add(updatedCat);
另一方面,如果此人仍然拥有同一只猫,但该猫已被重命名,则您应重命名旧猫,就像您对狗所做的那样:
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
currentCat.Name = "Felix";
您的代码不起作用,因为currentCat
引用的是cat,而不是列表中的点。如果您想以某种方式表示列表中的点,可以按照Jason的建议,在列表中使用索引。看起来您还不了解对象和对象引用之间的区别。你可能想做一些研究谢谢Jason。。。这开始有意义了,但我编辑了我的原始问题,以更接近地显示我在真实代码中所做的事情。我希望在我的业务层中有一个InsertOrUpdate方法,可以更新“pet”(或者根据唯一的Id值添加一个新的方法,如果它不存在)。我对更新的部分感到困惑。如果更新的pet参数作为变量进入方法,如何更新Person.Pets集合?这有意义吗?谢谢斯维克。正如我在下面对Jason所说的,并在我的编辑中显示的,如果我创建了一个UpdateOrInsert方法,并且更新的pet参数作为变量进入该方法,我如何更新Person.Pets集合?因为我使用的是实体框架,上下文是
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
currentCat.Name = "Felix";