加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:57:00 所属栏目:百科 来源:网络整理
导读:好的,这是我正在尝试解决的问题 – 我想通过 linq从db返回返回的对象特性到此对象属性,并且可以更新任何更改,而无需在db中插入新行. partial class Employee : Person{ public Employee(int id = 0) { if (id 0) this.get(id); } public override bool get(i
好的,这是我正在尝试解决的问题 – 我想通过 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方案之外,您无法重新分配此引用.根据您的使用/应用程序,使用 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# Naming Guidelines,以确保你的代码与大多数C#.NET代码更加一致.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读