c#中对象和方法的数据结构

时间:2016-07-05 10:06:38

标签: c# list dictionary data-structures

我是c#的新手,也是编程方面的新手。我需要帮助一个我过去一周试图弄清楚的主题。我有3个文件:

  1. 控制:这是一个界面,应该包含我的列表 方法
  2. ControlImpl:这是接口的实现。

  3. 运行时:包含main方法之间的绑定代码 和界面实现

  4. Test_main:从哪里调用 运行时方法' call'

  5. 问题:控制文件中可以有任意数量的实例(例如:c,c1,c2等),每个实例应该能够调用SetTime()和Nop()方法。

    我列出了方法SetTime()Nop()。但是,如何将实例添加到列表中,以便调用时每个实例都应调用其方法?

    CONTROL

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

    运行时:

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

1 个答案:

答案 0 :(得分:0)

请查看以下解决方案,我们可以将其作为基础来提出您的最终解决方案:

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