2016-07-20 8 views
-2

Моя программа на C# должна получать данные xml и хранить их в базе данных sql. У меня есть партии, у которых есть много инструкций. Я реализовать классы таким образом:C# ClassA имеет много ClassB, как получить доступ к методу экземпляра ClassA из экземпляра ClassB

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

Я пытался искать это экстенсивно, но каждый результат связан с наследованием, внутренние/внешние классы и т.д. Я бы например, чтобы избежать создания метода batchUID внутри класса, если это возможно.

+1

'new Инструкция [3]' просто размеры массива, все значения будут «null», там нет экземпляров 'Instruction'. Вы должны создать их, и хороший момент заключается в том, что вы передаете родительский элемент в качестве параметра конструктору 'Instruction'. –

+0

Вы должны как-то установить свои инструкции. 'myBatch.instructionArray [2] = new Инструкция {инструкцияUid =" foo "};' –

+0

ли я создаю экземпляр myBatch.instructionArray [n] или не имеет никакого значения для моего вопроса ... – p4ndepravity

ответ

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

это было самым близким к тому, что я искал, а также не стал объяснять, что мне нужно создать экземпляр переменной. спасибо Скотту – p4ndepravity

0

Ваш код имеет вопрос:

myBatch.instructionArray = new Instruction[3]; 

Это будет просто создать массив с 3 null значениями, а не 3-х экземпляров Instruction. Это связано с тем, что class является ссылочным типом, и он не будет автоматически создаваться здесь (struct s, однако, поскольку они являются типами значений и получают все свои значения, инициализированные в конструкторе по умолчанию, который затем вызывается). Вам все равно придется создать эти инструкции, прежде чем передавать их вашему методу, поскольку вы просто просто проходите 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 вещей внутри себя, но я не уверен, что этот проект должен достичь в конце концов.