它们听起来都很相似.来自msdn:
获取一个值,该值指示此参数是否可选.
此方法取决于可选的元数据标志.编译器可以插入此标志,但编译器没有义务这样做.
此方法使用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
我需要使用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上看了类似的问题,但没有找到任何能回答我问题的问题.
我欢迎任何解决方案的指示.
我有MethodInfo
一个GenericMethodDefinition.如:CallMethod<T>(T arg, string arg2)
.GetParameters()方法将为我提供两个ParameterInfo对象,第一个是通用的,第二个不是.如何让ParameterInfo告诉我它是通用的?如果它有约束怎么办?
好吧,我对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 …
我正在编写一个抽象类(在其构造函数中)收集所有遵循特定签名的静态方法.它收集的方法必须如下:
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) 如何确定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
,ConstructorInfo
或PropertyInfo
(索引).(2)ConstructorInfo
并且PropertyInfo
永远不会有返回参数.