C# 强制从特定类实例调用方法
问题是关于概念的 我有这样简单的课程:C# 强制从特定类实例调用方法,c#,class,methods,C#,Class,Methods,问题是关于概念的 我有这样简单的课程: public class Data { string Server = ""; public Data(string Server) { this.Server = Server; } public class Items { public class Item { public int Id { get; set; }
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public class Items
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public Item Get(int Id)
{
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
}
var data = new Data("0.0.0.0");
var item = new Data.Items().Get(3);
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
var item2 = data.Items().Save(3);
var item3 = data.OtherItems().Get(3);
var firms = data.Firms_List();
var firm = data.Firms_Get(firms[0].Id);
firm.Name = "New name";
data.Firms_Save(firm);
var firms = data.Firms.List();
var firm = data.Firms.Get(firms[0].Id);
firm.Name = "New name";
data.Firms.Save(firm);
这可能没有意义,但我解释了我想要实现的目标。现在我可以这样举例:
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public class Items
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public Item Get(int Id)
{
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
}
var data = new Data("0.0.0.0");
var item = new Data.Items().Get(3);
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
var item2 = data.Items().Save(3);
var item3 = data.OtherItems().Get(3);
var firms = data.Firms_List();
var firm = data.Firms_Get(firms[0].Id);
firm.Name = "New name";
data.Firms_Save(firm);
var firms = data.Firms.List();
var firm = data.Firms.Get(firms[0].Id);
firm.Name = "New name";
data.Firms.Save(firm);
但是对象之间没有任何连接。我希望通过以下方式获取/设置数据:
var item = new Data("0.0.0.0").Items().Get(3);
或者像这样:
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public class Items
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public Item Get(int Id)
{
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
}
var data = new Data("0.0.0.0");
var item = new Data.Items().Get(3);
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
var item2 = data.Items().Save(3);
var item3 = data.OtherItems().Get(3);
var firms = data.Firms_List();
var firm = data.Firms_Get(firms[0].Id);
firm.Name = "New name";
data.Firms_Save(firm);
var firms = data.Firms.List();
var firm = data.Firms.Get(firms[0].Id);
firm.Name = "New name";
data.Firms.Save(firm);
简而言之,我想初始化主类并传递一个参数,该参数是在子类中执行方法所必需的。如果不是从父类调用子类中的方法,则不可能在子类中使用这些方法。可能吗?
目标是在不使用static prop的情况下确定数据来自哪个数据库实例。然后调用各个方法,而不必传递SQL实例的名称 编辑以获得更深入的解释: 现在我可以像这样在主类中编写所有方法
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public List<Item> Items_List() { return new List<Item>(); }
public Item Items_Get(Int32 id) { return new Item(); }
public void Items_Save(Item item) { }
public List<Firm> Firms_List() { return new List<Firm>(); }
public Firm Firms_Get(Int32 id) { return new Firm(); }
public void Firms_Save(Firm item) { }
public List<Location> Location_List() { return new List<Location>(); }
public Location Location_Get(Int32 id) { return new Location(); }
public void Location_Save(Location item) { }
}
我想将方法名称中的“u”改为“.”,以提高可见性并进行如下类型分组:
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public class Items
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public Item Get(int Id)
{
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
}
var data = new Data("0.0.0.0");
var item = new Data.Items().Get(3);
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
var item2 = data.Items().Save(3);
var item3 = data.OtherItems().Get(3);
var firms = data.Firms_List();
var firm = data.Firms_Get(firms[0].Id);
firm.Name = "New name";
data.Firms_Save(firm);
var firms = data.Firms.List();
var firm = data.Firms.Get(firms[0].Id);
firm.Name = "New name";
data.Firms.Save(firm);
这可能吗?也许有一种方法可以对上述方法进行分组?
也许这个想法是错误的 我不确定我是否理解这个设计的目的,但无论如何,你可以想出一些语法上正确的方法来实现它 首先,可以将方法抽象化。在这种情况下,只能执行派生类的实现。如果此方法受保护,则只有父类可以调用它 另一方面,尽管您解释说您不想“传递SQL实例的名称”,但我的印象是对象状态正是为了这个目的——区分具有不同历史的对象,从而使它们的行为不同
我不知道这是否满足了您的期望,但再一次,我非常关心您提出的设计背后的动机。可以通过使用流畅的界面来实现 fluent接口是一种特殊的、自引用的方法链接形式,其中上下文通过链接进行维护
有关于这个的参考看起来您需要一种作用于项目表的存储库类
非常奇怪的设计。我想你只需要物品类。。。在该类中,通过连接字符串或先前打开的全局连接访问sql数据库。连接字符串可以存储在web.config或app.config中,并在应用程序中的任何位置使用 更新: 下面对你有用吗。。。我在Windows窗体应用程序中试用过,这句话很管用:
Item myItem = new Data("0.0.0").Item_Get (1);
类别:
public class Data {
string Server = "";
public Data(string Server) {
this.Server = Server;
}
public Item Item_Get(int Id) {
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
public class Item {
public int Id { get; set; }
public string Name { get; set; }
}
您的
数据
对象可以保存服务器(以及其他相关信息,如凭据),但每种类型的成员对象必须具有对数据
对象的引用,才能访问正确的实例数据:
public class Data {
string server;
public Data(string Server) {
server = Server;
items = new DataBase<Item>(this);
firms = new DataBase<Firm>(this);
locations = new DataBase<Location>(this);
otherItems = new OtherItem(this);
}
public class DataBase<T> where T : new() {
Data data;
public DataBase(Data myData) {
data = myData;
}
public virtual List<T> List() => new List<T>();
public virtual T Get(Int32 id) => new T();
public virtual void Save(T item) {
var s = data.server;
}
}
public class OtherItem : DataBase<Item> {
public OtherItem(Data myData) : base(myData) {
}
public override List<Item> List() {
return new List<Item>();
}
public override Item Get(int id) {
return new Item();
}
public override void Save(Item item) {
base.Save(item);
}
}
DataBase<Item> items;
DataBase<Firm> firms;
DataBase<Location> locations;
OtherItem otherItems;
public DataBase<Item> Items() => items;
public DataBase<Firm> Firms() => firms;
public DataBase<Location> Locations() => locations;
public OtherItem OtherItems() => otherItems;
}
我不想麻烦使用方法Items()
,而是直接使用Item
属性
我不知道如何阻止某人存储子引用并使用它,但是:
var dataItems = data.Items();
var item4 = dataItems.Get(4);
您的第一个示例没有编译。也许现在对我来说还太早,但您应该看到很多明显的编译时错误,不是吗?您所说的一些代码似乎根本不应该编译。公共类数据位于单独的.cs中,可以编译。当然,下面的代码“我希望以这种方式获取/设置数据:”不工作。这只是一个例子,说明调用应该是什么样子。不过,这只在一个级别上起作用。我现在有类似的解决方案,这并不奇怪。我正在尝试这样做,因为代码被编译成DLL。因此,调用应该尽可能简单,方法是创建一个对象(通过SQL实例传递字符串),然后只调用方法。我需要像这样访问多个类似类的项。我试图找到解决方案,其中传递参数是强制性的,应该只做一次。请检查我的编辑。我可以这样做,但对我来说,这不是一个很好的解决方案,当我试图用一个以上的类来做这件事的时候。我理解你的担心。我编辑了我的问题以便更好地解释。请检查一下。同时,我会尝试用抽象方法提出建议。我的情况是,更多的是分组方法,而不是自我参考。谢谢你的回答!这个答案最接近我想要得到的,我现在将使用它。