如何在静态方法中使用ID检索对象?

时间:2015-04-15 23:50:04

标签: c# asp.net

所以我有一个名为Object的基类,其中包含Id属性和一个名为Find()的静态方法。

public class Object
{
    public string Id { get; set; }

    public static Object Find(string id)
    {

    }
}

我还有一些继承自此类的其他类CustomerCompany。在某些时候,我需要使用继承的Customer方法并传入Company来找到具体的Find()Id。像这样:

var savedCustomer = Customer.Find(customer.Id);
var savedCompany = Company.Find(company.Id);

我显然无法使用this返回对象,因为它是一个静态方法,因此我无法找到找到对象的方法(无论是Customer还是{{1} })匹配Company,以便我可以返回它。

我在各处搜索过,似乎无法找到有效的解决方案。我还在学习IdC#所以我可能不知道这个问题的简单解决方案..

有没有简单的方法可以使用现有对象的ASP.NET来在这样的静态方法中找到它?或者它是不可能的?任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

通常,您应该将对象保存在真正的持久性存储中,例如数据库。

如果你真的想这样做,你的对象可以有static属性,如下所示:

private static List<Object> _list;

public static List<Object> {
   get {
       if(_list == null) _list = new List<Object>();
       return _list;
   }
}

然后您可以在此列表中按ID查找。请注意,我不认为你应该这样做。我怀疑你是来自一个有全局变量的语言,并试图复制它。 C#没有全局变量。试图像这样使用static会遇到麻烦。例如,如果您在多个服务器上运行ASP.NET应用程序,则每个服务器的static变量将具有不同的值。

答案 1 :(得分:0)

首先,您需要一些数据结构来存储您的Customer实例,以便您可以找到它们。让我们保持简单,并使用Dictionary

在我们开始之前,我建议您跳过静态Find()方法。这与Active Record模式非常接近。它在许多框架(主要是RoR)中很受欢迎,但我只是想表达我对它的厌恶。主要以混合数据类型和持久性为由。我已经说过我的一部分了,放手吧。

因此,我们将添加一个静态字典来跟踪我们的对象。

    public class Object
    {
        public string Id { get; private set; }

        private readonly static Dictionary<string, Object> objectCollection = new Dictionary<string, Object>();

        public Object(string Id)
        {
            this.Id = Id;
            objectCollection.Add(Id, this);
        }
        public static Object Find(string id)
        {
            return objectCollection[id];
        }
    }

哎呀,看看我们现在需要在构造函数中使用Id才能在集合中添加它?这意味着Id属性的setter必须是私有的,或者您需要更新set上的集合(未显示)。这个对象变得越来越复杂,实际上它只是一个字符串。你真的应该创建另一个组件来管理集合!但这是一个单独的问题。

另外,你扩展的课程要么实现自己的,要么必须做一些演员。

让我们写一下使用泛型的集合吗?

    public class Object
    {
        public string Id { get; set; }
    }

    public class ObjectCollection<T> where T : Object
    { 
        private readonly static Dictionary<string, T> objectCollection = new Dictionary<string, T>();

        public void Add(T newObject)
        {
            objectCollection.Add(newObject.Id, newObject);
        }
        public static Object Find(string id)
        {
            return objectCollection[id];
        }
    }

我不了解你,但我更喜欢它,它保持你的对象(及其任何扩展)非常简单,让你修改你的存储方式(字典,序列化到文件,存储在一个文件中) DB)分开。