C#ClassA有很多ClassB,如何从ClassB实例访问ClassA实例方法

时间:2016-07-20 16:58:33

标签: c# .net class parent-child has-many

我的C#程序需要接收xml数据并将其存储在sql数据库中。我有批次有很多说明。我这样实现了这些类:

class Batch
{
    public string batchUID { get; set; }
    public Instruction[] instructionArray { get; set; }
}

class Instruction
{
    public string instructionUID { get; set; }
}

我的程序像这样运行

Batch myBatch = new Batch();
myBatch.instructionArray = new Instruction[3];
myBatch.instructionArray[0] = new Instruction();
SomeFunc(myBatch.instructionArray[0]);

public void SomeFunc(Instruction instruction)
{
    // How do I do the following?
    console.write( instruction.OWNER.batchUID )
}

我试图对此进行广泛搜索,但每个结果都与继承,内部/外部类等有关。我希望尽可能避免在类Instruction中创建一个batchUID方法。

2 个答案:

答案 0 :(得分:0)

您的代码存在问题:

myBatch.instructionArray = new Instruction[3];

这将只创建一个包含3个null值的数组,而不是3个Instruction个实例。这是因为class是一个引用类型,它不会在这里自动实例化(struct但是,因为它们是值类型并且在默认构造函数中初始化它们的所有值然后被调用)。您仍然需要在将这些说明传递给方法之前创建这些说明,因为您实际上只是传递了null

然后,在创建Instruction的实例时,只需将父项作为参数传递,并在类中记住它,如下所示:

class Instruction
{
    public Instruction(Batch parent)
    {
        Parent = parent;
    }

    public Batch Parent { get; private set; }
    public string InstructionUID { get; set; } // Please start properties with an uppercase letter
}

这样,您就可以访问Batch实例稍后所属的Instruction实例。

Batch myBatch = new Batch();
myBatch.InstructionArray = new Instruction[3];
// TODO: Create the instances here, the array is just null null null now!
myBatch.InstructionArray[0] = new Instance(myBatch); // example
SomeFunc(myBatch.InstructionArray[0]);

public void SomeFunc(Instruction instruction)
{
    Console.Write(instruction.Parent.BatchUID)
}

如果这是好的设计是另一个问题,Instruction本身可能有SomeFunc个东西,但我不确定该项目最终应该达到的目的。

答案 1 :(得分:0)

您可以将Batch的实例传递给Instruction的构造函数,然后存储对可以使用属性公开的Batch的引用。 (这已经在另一个答案中显示了 - 我正在重复它,因为它为我接下来要添加的内容提供了背景。)

class Instruction
{
    public Instruction(Batch parent)
    {
        Parent = parent;
    }

    public Batch Parent { get; private set; }
    public string InstructionUID { get; set; } 
}

现在Instruction有一个Parent属性,返回Batch

但是存在差距。如果你打电话

var parent = batch.Instruction[0].Parent

parent == batch?看起来这就是意图。 Instruction包含对包含它的Batch的引用。

但没有什么是强制执行的。例如,我可以这样做:

someBatch.Instruction[0] = someOtherBatch.Instruction[1];

现在someBatch包含Instruction数组,但其中至少有一个实际上有someOtherBatch作为其父级。

也许这种可能性没什么大不了的,但我认为如果Parent是指Batch包含Instruction但可能没有,那么你实际上并没有完成了你的目标。

我建议您创建一个包含BatchInstruction的单独类。 (也许是ParentInstructionRelation?)

public class ParentInstructionRelation
{
    Batch Parent {get;private set;}
    Instruction Instruction {get;private set;}

    public ParentInstructionRelation(Batch parent, Instruction instruction)
    {
        Parent = parent;
        Instruction = instruction;
    }
}

那样Instruction不需要对其父级的引用。它可能不应该引用其父级。如果同一Instruction位于Batch的两个不同实例中会怎样?哪一个是父母?

但如果Batch需要公开Instruction 对自身的引用,那么它可以通过返回ParentInstructionRelation来实现。或者,从Instruction读取Batch的类可以创建该关系。

var instructions = batch.InstructionArray
    .Select(instruction => new ParentInstructionRelation(batch, instruction));