【问题标题】:How to get to a data object of class A from Class B (not from the main class)如何从 B 类(而不是从主类)获取 A 类的数据对象
【发布时间】:2015-07-15 17:28:23
【问题描述】:

假设我有 3 个班级:

主类,A类,B类

假设 B 类有一个方法需要来自 A 类的数据。(数据实际上是一个数据视图对象)。

A 类和 B 类的对象实例在主类中创建,与上述无关(一般都会创建)

从 B 类到达 A 类的数据视图对象的最佳方法是什么?

我应该将 dataview 对象设为内部吗?我应该让它静态吗?我应该让它内部静态吗?

我已经学会在这样的情况下创建属性并只是“获取”对象,但由于它是创建 A 类对象的主要形式(而不是 B 类),我无法从B类。


编辑,这是一段演示代码:

Class Main
{

A a = new A();
B b = new B();

a.doingAClassStuff(); //Not possible unless Class A is set to public or the method is set to internal (classes are internal by default)
b.doingBClassStuff(); //Likewise

//need to get the dv object here.
//dv.rows[1].foo = bar;
}

在上面的主类中,我需要从 B 类中获取 dv 对象。

//each class exist in a different class file (.cs file) inside the project
Class A 
{
doingAClassStuff()
{
MessageBox.Show("Hello From Class A!");
}
//here access to the dv object is also needed.
//dv.rows[5].foo = something;
}

A类也需要获取B类的dv对象!

//in another file as well
Class B 
{
DataView dv = new Dataview(datatable1)

doingBClassStuff()
{
MessageBox.Show("Hello From Class B!");
}
}

我的笔记:

  1. 仅将“dv”设置为“内部”不会使其可见。

  2. 使“dv”“内部静态”使其可见,我可以使用它,但我不确定“静态”没有缺点,我不会为每个类创建超过 1 个实例(如果事项)。

  3. 我尝试使用“get”设置属性并获取它,但由于属性是公开的,我无法将它们设置为“内部”,它们是否也对程序集外部公开?

非常感谢!

【问题讨论】:

  • 很难理解你在做什么......举一个更具体的例子......一段代码可以帮助很多
  • @FlorianSchmidinger 我已经添加了代码。我已经编辑了问题并添加了代码。谢谢!

标签: c# .net oop


【解决方案1】:

没有关于您的要求和限制的任何其他信息,这就是我的处理方式。

如果您需要Class A 以使Class B 正常运行,您可能应该为Class B 提供Class A 成员,并在Class B 的构造函数中对其进行初始化或提供设置成员的方法.

Class A 然后应该通过其公共接口以对类有意义的方式公开Class B 需要的内容。即不要只公开DataView

public class A
{
    private B _b;

    public A(B b)
    {
        _b = b;
    }

    void UseData()
    {
        _b.GetData();
    }
}

Public class B
{
    public DataView GetData();
}

其他地方

B b = new B();
A a = new A(b);

【讨论】:

  • 谢谢,我想了解您提供的内容,它对我来说看起来有点太复杂了,我想有一个更简单的解决方案。如果我编辑了问题并添加了代码这有帮助.. 再次感谢!
  • @Ray 我用我所说的一个例子更新了我的答案。听起来比实际上要复杂。
  • 有趣,我不知道这是可能的,但我认为如果我使用属性复制对象,我可能会在原始对象被复制之前读取它的副本被另一个班级改变了,因此它不会是它应该的样子。其次,我认为您不需要将类设置为“公共”,因为它们假设是内部的(默认情况下),而且我主要不确定 B 类中方法的“公共”,因为如果类也不会公开,并且该类将是内部的,属性将不起作用,我以前尝试过.. 谢谢!
  • 如果我在这里所说的一切都是正确的..也许设置它internal static是最好的解决方案..
  • @Ray 我将让您自行决定访问级别,因为这取决于您的具体需求。话虽如此,以我的经验,除非您碰巧制作库供其他人使用,否则您的大多数课程都可以公开。我不记得上次将课程标记为内​​部课程是什么时候了。至于复制,它不是复制,它是对另一个实例的引用,所以如果更新,a 将看到对b 的任何更改。
【解决方案2】:

从 B 类到达 A 类的数据视图对象的最佳方法是什么?

一些选项:

  • A 的实例传递给B 实例的方法
  • B 添加一个A 类型的属性(如果该实例将用于多个操作

我应该将 dataview 对象设为内部吗?我应该让它静态吗?我应该让它内部静态吗?

  • 如果您希望它可供所有类型在同一个程序集中访问,但不能在程序集之外访问(基本上对程序集私有

  • 如果您希望它对程序集内外的所有类型都可用,请将其设为 public

  • 如果数据适用于A所有个实例,则将其设为静态@

【讨论】:

  • @D Stanley 谢谢!我明白你所说的,我不确定我知道如何做你提供的前两件事,我会坐在上面。我还编辑了这个问题并添加了代码,如果这对我有更多帮助的话。 . 再次感谢!
【解决方案3】:

我还不能添加评论,但这似乎类似于以下要求与朋友等效的帖子。最佳答案是使用 InternalsVisibleTo 来实现类似的功能。

What is the C# equivalent of friend?

【讨论】:

  • 我不认为这是我正在寻找的解决方案.. 为类中的变量指定“内部”访问修饰符就足够了。它将该变量或字段公开给程序集中的所有类,并阻止程序集外部的程序集。如果我没记错的话,“InternalsVisibleTo”意味着您可以指定是否要让您的程序集对另一个特定的外部程序集可见。
  • 很抱歉。我会将此添加为评论,但我缺乏所需的声誉。祝你好运!
  • 没有问题。感谢您的尝试:)
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2021-12-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多