问题标签 [methodinfo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6789 浏览

c# - 询问 MethodInfo 需要多少参数的最有效方法是什么?

询问 MethodInfo 是否接受参数的最有效方法是什么,如果接受,有多少?

我目前的解决方案是:methodInfo.GetParameters().Any()methodInfo.GetParameters().Count().

这是最有效的方法吗?

由于我实际上不需要任何ParameterInfo对象,有没有办法在不调用的情况下做到这一点GetParameters()

0 投票
2 回答
1624 浏览

c# - 获取“get_Item” MethodInfo 的优化方式

现在,我有:targetType.GetMethod("get_Item", BindingFlags.Instance)

有更好的吗?

0 投票
2 回答
2920 浏览

c# - 如何通过反射读取方法体

是否可以通过反射找出有关 Method 主体的任何信息?

如何?

0 投票
1 回答
288 浏览

c# - 使用方法的 MethodHandle 作为键来缓存无参数方法的结果是否安全?

在 WCF 客户端应用程序中,有许多无参数方法,我们希望为其缓存结果 - GetAllFoo(), GetAllBar(). 这些用于填充下拉列表等,并且结果在客户端的运行期间不会改变。

这些结果当前由存储在资源文件中的唯一字符串缓存 - 例如,GetAllCountries()针对CountryKey资源进行缓存。仅当缓存不包含请求的键时才调用该服务。

这很好,除了我们需要维护资源文件中的键,并且需要确保每个方法都使用正确的缓存键,否则事情会中断。旧的 Control+C、Control+V 在这里引起了一些头痛,我不想去检查每个调用这个方法的地方。

所以问题:

serviceCall委托上有一个属性Method,它描述了要执行的方法。这是一个 MethodInfo 实例,它又包含一个MethodHandle属性。我是否正确假设该MethodHandle属性唯一且一致地标识所引用的方法?

我会将包装器更改为

它正确地封装了缓存和关键问题,并消除了对调用者“做正确的事”的任何依赖。

  • 不在乎 MethodHandle 是否在实例之间发生变化 - 缓存仅针对每个实例
  • 不要关心 MethodHandle 是否在客户端之间不一致 - 缓存是每个客户端的
  • 注意 MethodHandle 在客户端实例中是否不一致 - 我实际上希望使用缓存,而不是每个请求都会导致新的服务调用并且缓存中充满未使用的数据
  • 注意 MethodHandle 在客户端实例中是否不是唯一的 - 我必须确保在使用包装器时返回正确的数据(和类型)。
0 投票
1 回答
154 浏览

c# - 为什么.NET中_MethodInfo接口不叫IMethodInfo?

我只是在阅读该MethodInfo类型并遇到这种类型,并最初认为它是某种非托管类。然后看到它实际上是一个接口。

有谁知道为什么没有命名IMethodInfo?我认为为接口加上前缀I是 .NET 中的标准做法。是因为一些命名冲突吗?

0 投票
0 回答
116 浏览

c# - 使用 ac# 解析器获取方法签名的行号

与这个问题非常相关: 对于字段

它描述了我如何获得方法的 #s 行。但是......我只能使用这种方法获得方法中语句的行#s。我怎样才能得到方法签名的第 # 行以及它们有多长?

0 投票
1 回答
3121 浏览

c# - 使用 MethodInfo.Invoke 在 Win32 DLL 和 C# 之间传递 LPSTR

我正在开发一个需要能够调用 Win32 DLL 中的函数的项目。但是,DLL 的名称、函数以及所有参数的数据类型和返回类型在编译时是未知的,因此不能使用 DLLImport。基本上,这个例程可以调用任何 DLL 中的任何函数并传入任何参数。经过大量搜索,我已经能够成功地将一些可以做到这一点的代码放在一起,包括将数字和字符串传递给函数,甚至通过引用传递数字参数。但是,我在试图从 DLL 传回字符串时遇到了障碍。

为了简化测试,我使用 Visual Studio 6 编译了一个名为 PassCharPtr.dll 的简单 Win32 DLL,其中包含一个函数,如下所示:

PassCharPtr.def 文件:

PassCharPtr.h 文件:

PassCharPtr.cpp 文件:

为了测试我的 DLL,我创建了一个简单的 VB6 应用程序:

一切都很好。现在,这是我在 VS2010 中尝试访问此功能的 C# 测试项目:

如果我将第一个参数声明为 char[] (System.String),我可以成功地将字符串传递给函数,但是当 DLL 尝试用要返回的字符串替换该字符串时,它会生成异常(访问受保护的内存)。

如果我将第一个参数声明为 LPSTR (System.IntPtr),我无法将字符串传递给函数。但是,从调用返回后,argValuesArray[0] 包含似乎是地址的内容。我还没有弄清楚如何将该地址转换为返回的字符串。我尝试使用 String mvValue = Marshal.PtrToStringAnsi((IntPtr)argValuesArray[0]),但这会返回一个空字符串。

这段代码还有很多漏洞,但我希望大体思路足够清晰。谁能告诉我第一个参数应该声明什么数据类型才能成功地将字符串传入和传出这个函数,以及如何对该数据类型进行任何必要的转换?

0 投票
3 回答
3551 浏览

c# - 如何将 MethodInfo.Invoke 方法返回的值类型转换为正确的类型?

我想调用一个返回 a的方法struct,使用该MethodInfo.Invoke方法。但是,此方法的返回变量的类型是object,不能强制转换为struct

(发现,以及从切换struct到的建议class,在这里:http: //msdn.microsoft.com/en-us/library/b7tch9h0 (VS.90).aspx )

那么如何将调用方法的(值)结果转换为正确的类型呢?

(我也尝试过简单的演员阵容,但它抛出了 InvalidCastException)

以下是我的一些代码块:

谢谢你们!

0 投票
1 回答
226 浏览

c# - 获取 Enumerable.DefaultIfEmpty 的方法信息

我正在构建一些 Linq 表达式并尝试获取 MethodInfo IEnumerable.DefaultIfEmptyhttp://msdn.microsoft.com/en-us/library/bb360179.aspx)。这似乎是一件容易的事,但我不知道为什么它不起作用。

0 投票
3 回答
3949 浏览

c# - 在 C# 中使用反射调用方法时如何对参数进行自动类型转换?

我需要使用 C# 通过反射调用类型的方法。

在运行时,我的数据将包含一个包含名称/值对的字典。Dictionary 中的名称将对应于我将调用的方法上的参数名称。此外,在运行时,我将拥有一个任意的程序集限定类型名称和一个方法名称。在设计时,我不知道类型和方法,除了该方法将接受可变数量的 int、string、DateTime、bool、int[]、string[]、DateTime[] 或 bool 类型的参数[]。

我可以毫无问题地使用反射创建该类型的实例并调用该方法。我被困在我必须将字典中的字符串值转换为调用时方法所需的适当类型的地步:

我知道我可能需要通过 MethodInfo.GetParameters() 枚举并为每个参数执行类型转换。我想弄清楚的是如何做到这一点,理想情况下,如何有效地做到这一点。

到目前为止,我的研究涉及深入研究 MVC 源代码,因为它在将表单值传递给 ActionMethod 时做了类似的事情。我找到了ActionMethodDispatcher,但它使用了我不熟悉的 LINQ 表达式。

我还查看了关于 SO 的类似问题,但没有找到任何可以回答我问题的内容。

我欢迎任何指向解决方案的指针。