我在2个不同的文件中有2个类。
class InvokeMethod
:从actionID
接收字节数组(此处转换为int Main()
),并应根据{{1}调用存储在字典中的方法}。这个类应该只有通用代码,以便它可以接受任意数量的方法和对象。
类actionID
:添加接口实现中的所有方法,并返回带有键值对的字典。
ListOfMethods
方法应该只有Main
我已经完成了字符串到字节的数组转换(这就是为什么我没有把它放在这里)。
班级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;
}
}
答案 0 :(得分:0)
您似乎认为将dynamic
存储方法最终能够使用常规的编译时语法调用它们:x.Method()
,但事实并非如此!
使用反射时,您将获得元数据。它们不是方法,而是可以用来调用它们的这些方法的元数据。
Type.GetMethods()
为您提供了一个MethodInfo
数组,您可以按如下方式调用方法:methodInfo.Invoke(instanceOfDeclaringType, new object[] { })
其中给定数组中的每个索引都是方法的参数。如果方法为static
,您可以调用方法null
作为MethodInfo.Invoke
的第一个参数。