使用c#

时间:2016-07-07 09:06:48

标签: c# dictionary methods invoke

我在2个不同的文件中有2个类。

  1. class InvokeMethod:从actionID接收字节数组(此处转换为int Main()),并应根据{{1}调用存储在字典中的方法}。这个类应该只有通用代码,以便它可以接受任意数量的方法和对象。

  2. actionID:添加接口实现中的所有方法,并返回带有键值对的字典。

  3. ListOfMethods方法应该只有Main 我已经完成了字符串到字节的数组转换(这就是为什么我没有把它放在这里)。

  4. 班级im.checkID(dataFromString("00 00 00 00"));应根据InvokeMethod调用存储在词典中的方法。

    的InvokeMethod

    actionID

    ListOfMethods

    public class InvokeMethod 
    {
        public void checkID(byte[] data)
        {
            int actionID = BitConverter.ToInt32(data, 0);                     
            Console.WriteLine("action id {0}", actionID);
            ListOfMethods GetMethods = new ListOfMethods();
            Dictionary<int, dynamic> methodList = GetMethods.ReturnMethods(actionID);
    
            //here it should call the method from dictionary based on actionID.
    
        }
    } 
    

    控制界面

    public class ListOfMethods
    {
        Dictionary<int, dynamic> MethodDictionary = new Dictionary<int, dynamic>();
        Control ControlImplObj = new ControlImpl();
        Type ControlType = typeof(ControlImpl);
        public Dictionary<int, dynamic> ReturnMethods(int actionID)
        {
            var methods = ControlImplObj.GetType().GetMethods();
    
            foreach (var item in methods.Select((value, index) => new { index, value }))
            {
                if (item.value.DeclaringType == typeof(ControlImpl))
                {
                    MethodDictionary.Add(item.index, item.value);
    
                }
            }
    
          return MethodDictionary;
        }
    }
    

    控制界面实施

    interface Control
    {
        string SetTime();//0
        string Nop();//1
    }
    

    主要

    public class ControlImpl : Control
    {
        public string SetTime()                       
        {
            Console.WriteLine("inside SetTime ");
            return null;
    
        }
    
       public string Nop()                      
        {
            Console.WriteLine("inside Nop ");
            return null;
    
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您似乎认为将dynamic存储方法最终能够使用常规的编译时语法调用它们:x.Method(),但事实并非如此!

使用反射时,您将获得元数据。它们不是方法,而是可以用来调用它们的这些方法的元数据。

Type.GetMethods()为您提供了一个MethodInfo数组,您可以按如下方式调用方法:methodInfo.Invoke(instanceOfDeclaringType, new object[] { })其中给定数组中的每个索引都是方法的参数。如果方法为static,您可以调用方法null作为MethodInfo.Invoke的第一个参数。