强制方法从特定的类实例调用

时间:2018-02-27 16:19:45

标签: 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 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 item = new Data("0.0.0.0").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);

简而言之,我想启动主类并传递在子类中执行方法所需的参数。如果不从父类调用子类中的方法,则不应该使用子类中的方法 有可能吗?

目标是在不使用静态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) { }
}

然后我这样打电话:

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);

这可能吗?
也许有一种方法可以对上述方法进行分组? 或者也许想法是错误的。

5 个答案:

答案 0 :(得分:1)

您的Data对象可以保存服务器(以及其他相关信息,如凭据),但每种类型的成员对象必须具有对Data对象的引用才能访问正确的实例数据:

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;
}

现在你可以这样做:

var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
data.Items().Save(item1);
var item3 = data.OtherItems().Get(3);

我不打算使用方法Items()而只是直接使用Item属性。

我不知道如何阻止某人存储子引用并使用它,但是:

var dataItems = data.Items();
var item4 = dataItems.Get(4);

答案 1 :(得分:0)

看起来你需要一种作用于项目表的存储库类。

public class Items
{
    private Server { get; }
    public Items(string server) => Server = server;
    public Item Get(int id)
    {
        var item = new Item();
        //use Server inside the connectionString
        return item;
    }
    public void Save(Item item)
    {
        //use server inside the connectionstring to save the given item
    }
}

答案 2 :(得分:0)

非常奇怪的设计。我认为你只需要Item类......并且在该类中是通过f.e访问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; }
}

答案 3 :(得分:-1)

我不确定我理解这个设计的目的是什么,但无论如何,你可以想到一些语法上正确的方法来实现它。

首先,你可以将方法抽象化。在这种情况下,只能执行派生类的实现。如果此方法受到保护,则只有父类可以调用它。

另一方面,尽管您的解释是您不希望“传递SQL实例的名称”,但我的印象是对象状态正是出于此目的 - 区分具有不同历史的对象,因此,使他们的行为不同。

我不知道这是否满足您的期望,但又一次 - 我非常关注您提出的设计背后的动机。

答案 4 :(得分:-1)

可以通过流畅的界面实现。

流畅的界面是一种专门的自引用形式的方法链,其中通过链维护上下文。

参考此stackoverflow Q&A