2016-07-05 18 views
1

Ich bin neu in C# und ziemlich neu in der Programmierung. Ich brauche Hilfe bei einem Thema, das ich in der vergangenen Woche herausgefunden habe. Ich habe 3 Dateien:Datenstruktur von Objekten und Methoden in C#

  1. Steuerung: dies ist eine Schnittstelle und sollte die Liste meiner Methoden
  2. ControlImpl enthalten: das ist die implementaion der Schnittstellen.

  3. Laufzeit: enthält, welche die Bindungs ​​Code zwischen Hauptverfahren und der Schnittstelle implementaion

  4. Test_main: von wo Ich nenne die Laufzeitmethode 'rufen'

Problem: Es kann eine beliebige Anzahl von Instanzen (für zB: c, c1, c2 usw.) in der Steuerdatei geben und jede Instanz kann die Methoden SetTime() und Nop() aufrufen.

Ich machte eine Liste der Methoden SetTime() und Nop(). Aber wie kann ich die Instanz zu einer Liste hinzufügen, so dass jede Instanz beim Aufruf ihre Methoden aufrufen soll?

KONTROLL

namespace create_interface 
{ 
interface Control 
{ 

    void SetTime(params object[] paramsArr); 
    void Nop(params object[] paramsArr); 
} 

public class CM 
{ 
    Control c = new ControlImpl(); 
    public List<object> ControlMain() 
    { 


     List<object> methods = new List<object>(); 
     methods.Add(new Action<object[]>(c.SetTime));         
     methods.Add(new Action<object[]>(c.Nop));      
     return methods; 
    } 

} 

} 

ControlImpl:

namespace create_interface 
{ 
    public class ControlImpl : Control 
    { 
    void Control.SetTime(params object[] paramsArr)      
    { 
     Console.WriteLine("inside Control.SetTime {0} ", paramsArr[0]); 

    } 

    void Control.Nop(params object[] paramsArr)      
    { 
     Console.WriteLine("inside Control.Nop "); 

    } 
    } 
} 

Laufzeit:

namespace create_interface 
    { 

public class runtime 
{ 
public void call(params object[] methodparams) 
    { 


     if ((methodparams[0].Equals(0)) || (methodparams[0].Equals(1))) 
     { 
      //List<Control> objectlists = cmObject.ControlObjectList(); 

      List<object> methods = cmObject.ControlMain(); 
      //Console.WriteLine(methods.Count); 
      Action<object[]> method = (Action<object[]>)methods[(int)methodparams[0]];  //object[] 
      object[] args = new object[] { methodparams[1] }; 
      method(args); 
     }    

     else 
      Console.WriteLine("wrong ID number entered"); 
    } 

Test_main:

namespace create_interface 
{ 
    class test_main 
    { 

    static void Main(string[] args) 
    { 
     long time; 
     CallingFunc CF = new CallingFunc(); 


     Console.WriteLine("enter method ID"); 
     int methodID = Convert.ToInt32(Console.ReadLine()); 
     try 
     { 
      switch (methodID) 
      { 
       case 0: 
        Console.WriteLine("enter the time in long"); 
        time = Convert.ToInt64(Console.ReadLine()); 
        CF.call(methodID, time); 
        break; 

       case 1: 
        CF.call(methodID, null); 
        break; 

       default: 
        Console.WriteLine("you entered wrong method ID or parameters"); 
        break; 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
+0

Meinten Sie eine Liste mit allen Instanzen mit einer bestimmten Methode auf alle auszuführen sie zur gleichen Zeit? Sehen Sie sich in diesem Fall das Objekt List im System.Collection.Generics-Namespace an. –

+0

@NahuelIanni die Test_main sollte Runtime.call (ID) enthalten; Es wird also eine ID an runtime-> call method übergeben, die mit der jeweiligen Instanz (dh; c, c1, c2, etc.) und mit der entsprechenden Methode (zB; SetTime oder Nop) verlinkt werden soll. –

+0

@NahuelIanni Also dachte ich, es sollte so etwas wie einen Baum brauchen. Ein Baum, der aus Instanzen und diesen Instanzen besteht, sollte mit der Methode verknüpft sein. Aber ich bin mir nicht sicher, ob dies die richtige Vorgehensweise ist. –

Antwort

0

Bitte werfen Sie einen Blick auf die folgende Lösung, und wir können sie als Basis mit der endgültigen Lösung zu kommen verwenden:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 

namespace StackOverflow38200633 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Collection<IControl> controls = new Collection<IControl>(); 
      controls.Add(ControlFactory.Create()); 
      controls.Add(ControlFactory.Create()); 
      controls.Add(ControlFactory.Create()); 

      ControlManager manager = new ControlManager(controls); 

      Console.WriteLine("Enter method ID:"); 
      int methodID = Convert.ToInt32(Console.ReadLine()); 

      try 
      { 
       switch(methodID) 
       { 
        case 0: 
         Console.WriteLine("Enter the time in long: "); 
         long time = Convert.ToInt64(Console.ReadLine()); 
         manager.InvokeAllSetTime(time); 
         break; 
        case 1: 
         manager.InvokeAllNop(); 
         break; 
        default: 
         Console.WriteLine("You entered wrong method ID or parameters"); 
         break; 
       } 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(); 
     } 
    } 

    public interface IControl 
    { 
     void SetTime(long time); 
     void Nop(); 
    } 

    public class ConcreteControl : IControl 
    { 
     public void SetTime(long time) 
     { 
      Console.WriteLine("inside Control.SetTime {0} ", time); 
     } 
     public void Nop() 
     { 
      Console.WriteLine("inside Control.Nop "); 
     } 
    } 

    public class ControlManager 
    { 
     public void InvokeAllSetTime(long time) 
     { 
      foreach(IControl control in _controls) control.SetTime(time); 
     } 
     public void InvokeAllNop() 
     { 
      foreach(IControl control in _controls) control.Nop(); 
     } 
     public ControlManager(Collection<IControl> controls) 
     { 
      _controls = controls; 
     } 
     public Collection<IControl> _controls { get; private set; } 
    } 

    public static class ControlFactory 
    { 
     public static IControl Create() 
     { 
      return new ConcreteControl(); 
     } 
    } 
} 
Verwandte Themen