3

好的,这是我要解决的问题 - 我想将通过 linq 从 db 返回的对象属性分配给该对象 prperties 并获得更新任何更改的可能性,而无需在 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 方法成为静态的。

4

3 回答 3

5

给你一个很好的例子/建议有点困难,因为我们没有太多关于你的应用程序或最终目标使用的上下文。但是,在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# Naming Guidelines以确保您的代码与大多数 C#.NET 代码更加一致。

于 2013-08-26T12:28:51.080 回答
2

不可能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");
于 2013-08-26T12:17:31.500 回答
0
  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();
   }
 }

我希望这将有所帮助。

于 2013-08-26T12:42:20.460 回答