所以我有一个名为Object
的基类,其中包含Id
属性和一个名为Find()
的静态方法。
public class Object
{
public string Id { get; set; }
public static Object Find(string id)
{
}
}
我还有一些继承自此类的其他类Customer
和Company
。在某些时候,我需要使用继承的Customer
方法并传入Company
来找到具体的Find()
或Id
。像这样:
var savedCustomer = Customer.Find(customer.Id);
var savedCompany = Company.Find(company.Id);
我显然无法使用this
返回对象,因为它是一个静态方法,因此我无法找到找到对象的方法(无论是Customer
还是{{1} })匹配Company
,以便我可以返回它。
我在各处搜索过,似乎无法找到有效的解决方案。我还在学习Id
和C#
所以我可能不知道这个问题的简单解决方案..
有没有简单的方法可以使用现有对象的ASP.NET
来在这样的静态方法中找到它?或者它是不可能的?任何帮助将不胜感激。感谢
答案 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)分开。