Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从名称和签名解析方法的方法_C#_Reflection_Expression_Reflection.emit - Fatal编程技术网

C# 从名称和签名解析方法的方法

C# 从名称和签名解析方法的方法,c#,reflection,expression,reflection.emit,C#,Reflection,Expression,Reflection.emit,如果您有一个方法名和一个参数类型数组以及一个签名,那么可以使用反射来获取MethodInfo并调用该方法 MethodInfo info = myObj.GetType().GetMethod("MethodName", new object[] { typeof(string), typeof(int) }); info.Invoke(myObj, new object[] {"Hello", 22}); 以这种方式调用MethodInfo非常慢。为了加快速度,我们可以创建一个映射,该映射

如果您有一个方法名和一个参数类型数组以及一个签名,那么可以使用反射来获取MethodInfo并调用该方法

MethodInfo info = myObj.GetType().GetMethod("MethodName", new object[] { typeof(string), typeof(int) });

info.Invoke(myObj, new object[] {"Hello", 22});
以这种方式调用MethodInfo非常慢。为了加快速度,我们可以创建一个映射,该映射包含MethodInfo的包装器,MethodInfo使用表达式API或Reflection.Emit调用该方法

但是,这样做需要维护MethodInfo包装器的签名映射。要做到这一点,我们需要一个表示名称+签名的键,以便在尝试调用方法时,如果存在所需的MethodWrapper,我们可以从映射中快速找到它。我正在寻找关于如何生成该密钥的建议。目前,我正在考虑简单地将MethodName与签名中每种类型的名称连接起来以生成密钥,但这对我来说似乎很慢

寻找更好选择的建议

编辑:

假设我有一个带有一个参数的方法:

DoSomething(object parameter);
签名是DoSomething+typeofobject

不,假设我传入签名DoSomething+TypeOfSometypeThederivesFromObject


这些签名应该匹配。

创建一个具有名称和参数类型属性的类型,然后为其实现可比较接口以执行搜索比较。我认为IComparable不适用于字典查找。我想基本的问题是我需要实现一个版本的GetHashCode和Equals。重申这个问题,有什么好的策略可以生成HashCode?XOR^从属性中获取HashCode。它不是自动哈希表中的键吗?即key->hashed key->lookup in table。如果是这样的话,使用字符串的速度会不会和使用预灰化版本一样快?@M.Babcock,请参见上面的编辑。不确定XOR在这种情况下是否公平,也不确定我的初始连接字符串解决方案是否公平