Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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 - Fatal编程技术网

C#使用反射获取参数值

C#使用反射获取参数值,c#,reflection,C#,Reflection,如何获取parms的值(在使用反射的循环中)。 在前面的问题中,有人向我展示了如何使用反射在parm中循环 static void Main(string[] args) { ManyParms("a","b","c",10,20,true,"end"); Console.ReadLine(); } static void ManyParms(string a, string b, string c, int d, short e, bool f, string g) {

如何获取parms的值(在使用反射的循环中)。 在前面的问题中,有人向我展示了如何使用反射在parm中循环

static void Main(string[] args)
{
    ManyParms("a","b","c",10,20,true,"end");
    Console.ReadLine(); 
}

static void ManyParms(string a, string b, string c, int d, short e, bool f, string g)
{
    var parameters = MethodBase.GetCurrentMethod().GetParameters();
    foreach (ParameterInfo parameter in parameters)
    {
        string parmName = parameter.Name;
        Console.WriteLine(parmName); 
        //Following idea required an object first 
        //Type t = this.GetType();
        //t.GetField(parmName).GetValue(theObject));

    }
}
如果你一定要知道我为什么要这样做,请看这里:


谢谢大家-在Python、PERL和PHP中,这似乎很简单。
即使它可能不是反射,但如果我使用反射来获取字段名,似乎有一种简单的动态方法可以基于名称获取值。 我还没有尝试过AOP(面向方面编程)的解决方案。
这是其中的一件事,如果我不能在一两个小时内完成,我可能不会去做

基本上,你做不到——至少在没有进入网络的情况下是不行的


从理论上讲,类可以通过某种方式公开参数值,但事实并非如此——我怀疑,为了做到这一点,您必须删除一些优化。

您不能通过反射,也不应该这样做


如果您需要此类功能,请使用代理,例如通过RealProxy实现拦截您的呼叫。然后,您可以在进行实际调用之前检查和修改任何参数(或者甚至根本不进行原始调用,这由您决定)。

您不能这样做。反射作用于编译期间嵌入的元数据,当时参数值未知。

您考虑过使用AOP吗


它可以在方法执行之前访问参数值,因此代码将简化为可重用的属性类,以及应用于需要进行此检查的方法的属性。

您无法使用反射获取方法参数的值。因为反射返回元数据信息。如果您想获取特定字段或属性的值,还需要使用实例(如您所知)

有几种方法可以使用.NET framework的内部管道获取参数值,即探查器API和调试器API


你可以用AOP做你想做的事,有一个名为Codeplex的项目可能会对您有所帮助—使用CThru,您可以在调用该方法时拦截该方法,并获取调用该方法时使用的参数。

您可以通过在方法中创建匿名类型并利用投影初始值设定器来解决此问题。然后可以使用反射查询匿名类型的属性。例如:

static void ManyParms(
    string a, string b, string c, int d, short e, bool f, string g)
{
    var hack = new { a, b, c, d, e, f, g };

    foreach (PropertyInfo pi in hack.GetType().GetProperties())
    {
        Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null));
    }
}
支持IncludeParameterValue选项

如果您想了解有关创建迷你转储的更多详细信息


请看,如果我有更多的时间,我会调查这件事的。如果你看到我上面提到的文章,我使用的是Microsoft Host Integration Server,特别是HIP,但不确定代理将如何与这些家伙一起使用。这需要你更改方法的内容。如果您要这样做,您可以报告这些值。这种语法使这样做稍微容易一点,但我怀疑它是否真的对OP有帮助。@Jon:当然,你是对的,但这比手动输入要少很多,而且因为没有像
Console.WriteLine(“a:+a)
等多个硬编码行,错误的范围要小得多。这在PostSharp或Fody中是一件很好的事情。但是您可以使用反射来获取对象中的属性值,这些属性在编译时是未知的。也许可以通过反射检查使用IEnumerable时生成的状态机来完成?只是一个我不知道如何实现自己的想法:-)(由于今天有一个重复的问题而在这里发表评论)请指导,如何在C#…中获取函数形式参数列表。。。?我需要得到函数的形式参数dynamically@Vikrant当前位置我建议你问一个更详细的新问题。补充,请提供有用的信息给我。