C#如何将linq返回的对象分配给';这';参考
本文关键字:参考 分配 对象 linq 返回 | 更新日期: 2023-09-27 18:29:05
好吧,这就是我试图解决的问题-我想将通过linq从数据库返回的对象属性分配给这个对象属性,并获得更新任何更改的可能性,而无需在数据库中插入新行。
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;
}
}
另一种选择可能是提取接口的各种属性,然后可以围绕类的可重新分配实例创建一种包装器:
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#命名指南,以确保您的代码与大多数C#.NET代码更加一致。
不可能在类中分配this
。这基本上就是告诉一个物体它不是自己。你能得到的最接近你所写的是工厂方法模式:
public class CoolClass {
public string MyProperty { get; private set; }
public string MyOtherProperty { get; private set; }
private CoolClass(string myProperty, string myOtherProperty) {
MyProperty = myProperty;
MyOtherProperty = myOtherProperty;
}
public static CoolClass CreateNew(string myProperty, string myOtherProperty) {
return new CoolClass(myProperty, myOtherProperty);
}
}
然后您可以按如下方式使用:
var coolClass = CoolClass.CreateNew("blah", "something");
public class MyClass
{
private static MyClass myClass;
public int Id
{
get
{
return myClass.Id;
}
set
{
myClass.Id = value;
}
}
public static MyClass Get()
{
if (myClass == null)
{
myClass = NewClass.create();
}
return myClass;
}
}
static class NewClass
{
public static MyClass create()
{
return new MyClass();
}
}
我希望这会有所帮助。