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方法成为静态的。

C#如何将linq返回的对象分配给';这';参考

很难给你一个好的例子/建议,因为我们没有太多关于你的应用程序或最终目标用途的上下文。但是,除了发布的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();
   }
 }

我希望这会有所帮助。