标签: parameterinfo

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

它们听起来都很相似.来自msdn:

ParameterInfo.IsOptional

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

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

此方法使用ParameterAttributes枚举器的Optional标志.

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

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

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

public void A(string value)
{

}
public void B(string value, int i = -1)
{

}
Run Code Online (Sandbox Code Playgroud)

我写:

var a = AInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var b = AInfo.GetParameters().Select(p => p.IsOptional).ToArray();

var c = BInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var d = BInfo.GetParameters().Select(p => p.IsOptional).ToArray();

//a equals b; and c equals d
Run Code Online (Sandbox Code Playgroud)

那么它们在哪种情况下有所不同?为什么BCL HasDefaultValue新推出.NET 4.5?

.net reflection default-value optional-parameters parameterinfo

11
推荐指数
1
解决办法
928
查看次数

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

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

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

我没有问题,我可以使用反射创建该类型的实例并调用该方法.当我调用时,我不得不将字典中的字符串值转换为方法所需的相应类型:

someMethodInfo.Invoke(instance, new [] { ... })
Run Code Online (Sandbox Code Playgroud)

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

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

我也在SO上看了类似的问题,但没有找到任何能回答我问题的问题.

我欢迎任何解决方案的指示.

c# reflection dynamic methodinfo parameterinfo

8
推荐指数
1
解决办法
3404
查看次数

如何确定ParameterInfo是否是泛型类型?

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

c# generics reflection methodinfo parameterinfo

7
推荐指数
1
解决办法
1507
查看次数

ParameterInfo属性,属性和out参数的方法

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

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

  • 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 …

c# reflection ref out parameterinfo

6
推荐指数
1
解决办法
1469
查看次数

使用Reflection测试方法是否具有特定签名

我正在编写一个抽象类(在其构造函数中)收集所有遵循特定签名的静态方法.它收集的方法必须如下:

static ConversionMerit NAME(TYPE1, out TYPE2, out string)
Run Code Online (Sandbox Code Playgroud)

我不关心命名或前两个参数的类型,但第二个和第三个参数必须是'out'参数,第三个参数必须是System.String类型.

我的问题是最后检查字符串:

MethodInfo[] methods = GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
  foreach (MethodInfo method in methods)
  {
    if (method.ReturnType != typeof(ConversionMerit))
      continue;

    ParameterInfo[] parameters = method.GetParameters();
    if (parameters.Length != 3)
      continue;

    if (parameters[0].IsOut) continue;
    if (!parameters[1].IsOut) continue;
    if (!parameters[2].IsOut) continue;

    // Validate the third parameter is of type string.
    Type type3 = parameters[2].ParameterType;
    if (type3 != typeof(string))   // <-- type3 looks like System.String&
      continue;

    // This is where I do something irrelevant to …
Run Code Online (Sandbox Code Playgroud)

c# reflection reference-type parameterinfo

2
推荐指数
1
解决办法
473
查看次数

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

如何确定a ParameterInfo是否为返回参数?

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

public bool IsReturnParameter(ParameterInfo parameter){
    var method = parameter.Member as MethodInfo;
    return method != null && parameter.Equals(method.ReturnParameter);
}
Run Code Online (Sandbox Code Playgroud)

(1)参数都宣布对成员是:我的一对夫妇的假设,这可能是有缺陷的这个基础MethodInfo,ConstructorInfoPropertyInfo(索引).(2)ConstructorInfo并且PropertyInfo永远不会有返回参数.

.net c# reflection system.reflection parameterinfo

2
推荐指数
1
解决办法
380
查看次数