gpt4 book ai didi

C# 如何将从 linq 返回的对象分配给 'this' 引用?

转载 作者:行者123 更新时间:2023-11-30 14:12:09 24 4
gpt4 key购买 nike

好的,这就是我要解决的问题 - 我想将通过 linq 从 db 返回的对象属性分配给该对象属性,并获得更新任何更改的可能性,而无需在 db 中插入新行。

partial class Employee : Person
{
public Employee(int id = 0)
{
if (id > 0)
this.get(id);
}

public override bool get(int id)
{
Employee empl = db.Employees.Single(Employee => Employee.id == id);
if (empl != null)
{
// here I need to do sth like
this = empl;
// or
ObjectProperties.Copy(empl, this);
return true;
}
else
return false;
}

public override void save()
{
if (this.id > 0)
{
db.SubmitChanges();
}
else
{
db.Employees.InsertOnSubmit(this);
db.SubmitChanges();
}
}

public override void remove()
{
if (this.id > 0)
{
db.Employees.DeleteOnSubmit(this);
db.SubmitChanges();
}
}
}

而且我不想让 get 方法成为静态的。

最佳答案

很难为您提供一个很好的示例/建议,因为我们没有太多关于您的应用程序或最终目标用途的上下文。但是,在发布的 struct 场景之外,您不能重新分配 this 引用。根据您的使用/应用程序,使用 ref 可能或更正确可能关键字,但如果没有关于您的使用情况的更多信息,我不确定这一点。


然而,根据您的评论,您只想更新您的类的所有属性,拥有一种“CopyInfo”方法可能是最简单的,它只会从另一个实例复制值:

class MyClass
{
public MyClass()
{
this.id = 2;
}

public void get()
{
CopyInfo(NewClass.Create());
}

private void CopyInfo(MyClass otherInstance)
{
this.id = otherInstance.id;
}
}

另一种选择可能是将各种属性提取到接口(interface)中,然后您可以围绕类的可重新分配实例创建一种包装器:

public interface MyInterface
{
public int id { get; }
}

class MyClass : MyInterface
{
public int id { get; private set; }

public MyClass()
{
id = 2;
}
}

那么包装类可能是:

class MyReassignableClass : MyInterface
{
private MyClass BackingInstance;

public int id
{
get
{
return BackingInstance.id;
}
}

public void get()
{
BackingInstance = NewClass.create();
}
}

您的代码可以将其视为 MyInterface,但访问其成员实际上是间接访问另一个实例的成员,可以根据需要换出。

编辑:最后,我还建议您看一下 C# Naming Guidelines以确保您的代码与大多数 C#.NET 代码更加一致。

关于C# 如何将从 linq 返回的对象分配给 'this' 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com