我的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方法。
答案 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
但可能没有,那么你实际上并没有完成了你的目标。
我建议您创建一个包含Batch
和Instruction
的单独类。 (也许是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));