问题标签 [parameterinfo]

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 投票
4 回答
1741 浏览

c# - 如何确定 ParameterInfo 是否属于泛型类型?

我有MethodInfo一个 GenericMethodDefinition。如:CallMethod<T>(T arg, string arg2)。GetParameters() 方法将给我两个 ParameterInfo 对象,第一个是通用的,第二个不是。我怎样才能让 ParameterInfo 告诉我它是通用的?如果有约束怎么办?

0 投票
1 回答
259 浏览

dynamic - 使用 C# 在运行时读取参数、属性和返回类型的一种方法

继续我之前的线程使用反射读取包含另一个对象数组的对象的属性。我希望让 EvgK 中的这个美妙的方法成为一种通用方法,可以在我的代码库中的多个地方使用。

同样,我正在尝试读取用户传递的方法。我列出了参数、它们的属性和值。用户提供输入值后,我会动态调用该方法以获取结果对象。结果被传递给 GetMyProperties() 方法,该方法列出所有属性(到 n 级) - 名称、值和类型。

目前,我有两种方法(定义如下):

我使用第一个来显示所选方法的所有参数列表及其属性 - 名称、值和类型。

..创建我的属性列表,以便用户可以输入参数。我通过 ParameterType 和 GetProperties 方法检查它是否是自定义类型。如果是自定义类型,那么它会以递归方式调用自身以构建我绑定到网格以供输入的列表。

第二种方法 GetMyProperties(object obj) 用于列出返回对象。由于我在编译时不知道所选方法的返回类型,所以使用对象类型。我想知道我是否可以以某种方式修改第二种方法以使用它来读取参数、属性和返回类型?而不是有单独的方法?试图重用代码。

0 投票
1 回答
664 浏览

c# - 如何获取参数数量可变的函数的 ParameterInfo?

如何获取参数数量可变的函数的 ParameterInfo?问题是当我调用该方法时

我可以获取 sendData 的 parameterInfo 但不能获取 o1 和 o2 对象。

提前感谢您帮助我。

阿尔诺

0 投票
3 回答
3949 浏览

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

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

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

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

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

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

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

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

0 投票
1 回答
6688 浏览

c# - 为方法参数赋值

想象一个具有以下签名的方法:

根据 的值,data需要将 in 的值分配给ABCid。简而言之,如果id == "A"那时A = data;

问题是这个方法的主体是由人输入的,但签名是在运行时生成的。因此,不可能对逻辑进行硬编码,因为在设计时不知道会有多少 ref 参数以及它们被称为什么。这段代码可以插入到任意数量的方法中,每个方法都可能具有不同的签名,并且它必须在每个方法中工作。

我知道如何获取当前方法之一的所有参数,但我不知道如何为这些参数之一赋值。我正在寻找的是以下内容:

0 投票
2 回答
460 浏览

c# - 如何确定 ParameterInfo 是否为返回参数

如何确定 aParameterInfo是否是返回参数?

我写了下面的函数,但我担心我可能会遗漏一些东西:

我基于几个假设,这些假设可能存在缺陷:(1)参数是在成员上声明的MethodInfoConstructorInfoPropertyInfo(索引器)。(2)ConstructorInfo并且PropertyInfo永远不会有返回参数。

0 投票
1 回答
1598 浏览

c# - ParameterInfo 方法的属性、属性和 out ref 参数

好吧,我对ParameterInfo类的属性感到困惑。
不幸的是,文档不是很清楚:示例展示了如何构建方法,但没有展示这些方法在 C# 中的外观。

甘蔗有人告诉更多关于这些属性:

  • DefaultValue
  • HasDefaultValue
  • IsIn
  • IsLcid
  • IsOptional
  • IsOut
  • IsRetval

哪个组合导致什么方法参数。
我做了一个简单的程序,它给出以下输出:

方法名 M1 void M1(object param)
IL 签名:.method public hidebysig instance void M1(object param) cil managed
方法参数描述:
引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名 M2 void M2(object param = null)
IL 签名.method public hidebysig instance void M2([opt] object param) cil managed
方法参数描述:
引用传递 False
HasDefaultValue=True
DefaultValue=null
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称 M3 void M3(out object param)
IL 签名.method public hidebysig instance void M3([out] object& param) cil managed
方法参数描述:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=True
IsRetVal=False


方法名称 M4 void M4(ref object param)
IL 签名.method public hidebysig instance void M4(object& param) cil managed
方法参数说明:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名称 M5 void M5([In] object param)
IL 签名.method public hidebysig instance void M5([in] object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=True
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名称 M6 void M6([Out] object param)
IL 签名.method public hidebysig instance void M6([out] object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=True
IsRetVal=False


方法名称 M7 void M7([Out] out object param)
IL 签名.method public hidebysig instance void M7([out] object& param) cil managed
方法参数描述:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut =True
IsRetVal=False


方法名 M8 void M8([DefaultValue(null)] object param)
IL 签名.method public hidebysig instance void M8(object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名 M9 void M9([DefaultValue(-10)] int param = 10)
IL 签名.method public hidebysig instance void M9([opt] int32 param) cil managed
方法参数说明:
参数名称 param
通过引用传递 False
HasDefaultValue=True
DefaultValue=10
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称 M10 void M10([Optional] int param)
IL 签名.method public hidebysig instance void M10([opt] int32 param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue =False
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False

我猜InOut并且Optional属性与 COM 相关,因为它们位于 System.Runtime.InteropServices 命名空间中。
但是文档又很差。:(

什么是 RetVal 以及它在哪里使用?

0 投票
3 回答
1199 浏览

.net - ParameterInfo.IsOptional 和 ParameterInfo.HasDefaultValue 之间的区别?

它们听起来很相似。来自 msdn:

ParameterInfo.IsOptional

获取一个值,该值指示此参数是否可选。

此方法取决于可选的元数据标志。该标志可以由编译器插入,但编译器没有义务这样做。

此方法利用 ParameterAttributes 枚举器的 Optional 标志。

ParameterInfo.HasDefaultValue(.NET 4.5 中的新功能)

获取一个值,该值指示此参数是否具有默认值。

他们不一样吗?我做了快速测试:

我写:

那么它们在哪些情况下不同呢?为什么HasDefaultValue在.NET 4.5 中新引入了BCL?

0 投票
2 回答
264 浏览

c# - 如何判断 ParameterInfo 类型是否为集合?

有没有办法检查是否ParameterInfo是集合?

我试过这个:

但它不起作用。有任何想法吗?

0 投票
1 回答
57 浏览

c# - 如何获取传递参数的lambda中使用的方法名称

AssertManager.Record 中的参数正在运行,但我需要 lambda 操作中的值,即断言。所以我需要获取我使用的断言类型,我从一个类传递到另一个类。我出于某种原因使用了 lambda 表达式,所以我无法编辑它。我只需要一个字符串类型来说明我所做的任何类型的断言。在我的示例中,它应该向控制台输出“Assert.True”或“Assert.Equal”。

这是我使用的示例代码:

如果您对此有解决方案,请告诉我。谢谢你。