Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制从特定类实例调用方法_C#_Class_Methods - Fatal编程技术网

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实例传递字符串),然后只调用方法。我需要像这样访问多个类似类的项。我试图找到解决方案,其中传递参数是强制性的,应该只做一次。请检查我的编辑。我可以这样做,但对我来说,这不是一个很好的解决方案,当我试图用一个以上的类来做这件事的时候。我理解你的担心。我编辑了我的问题以便更好地解释。请检查一下。同时,我会尝试用抽象方法提出建议。我的情况是,更多的是分组方法,而不是自我参考。谢谢你的回答!这个答案最接近我想要得到的,我现在将使用它。