【问题标题】:Dynamically calling a method in C# ASP.NET在 C# ASP.NET 中动态调用方法
【发布时间】:2013-03-15 21:29:18
【问题描述】:

我以前见过用户解决这个问题,比如在线程中: C# very dynamic invocation

但我在给出的代码方面并没有取得太大的成功。我基本上是在尝试使用一些变量字符串来调用方法。

这是我目前所拥有的。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Model : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

       string TargetMethod = "Index";
       Type t = System.Type.GetType("_Model");

       System.Reflection.MethodInfo methodInfo = t.GetMethod(TargetMethod);
       methodInfo.Invoke(t, new object[] {});

    }

     protected void Index(){
       Response.Write("Index: Dynamically called!"); 
     }

}

在视图页面上,我应该看到字符串“索引:动态调用!”写入屏幕但出现错误:

异常详细信息:System.NullReferenceException:没有对象引用 设置为对象的实例。

请帮忙,谢谢。

【问题讨论】:

    标签: c# asp.net reflection


    【解决方案1】:

    默认情况下,GetMethod 只返回public 方法;添加BindingFlags.NonPublic | BindingFlags.Instance,它应该可以工作。

    var methodInfo = t.GetMethod(TargetMethod,
          BindingFlags.NonPublic | BindingFlags.Instance);
    

    或同时为公共非公共工作:

    var methodInfo = t.GetMethod(TargetMethod,
          BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    

    另外:它是一个实例方法,你想在当前实例上调用它,所以:

    methodInfo.Invoke(this, new object[] {});
    

    注意this,而不是t

    【讨论】:

    • 仍然无法工作,因为 Invoke 的参数错误。而不是t,应该是this
    • 他的代码中还有另一个错误。应该是methodInfo.Invoke(this, new object[] {});
    • 我添加了: System.Reflection.MethodInfo methodInfo = t.GetMethod(TargetMethod,BindingFlags.NonPublic | BindingFlags.Instance);但现在我收到错误:CS0103:当前上下文中不存在名称“BindingFlags”
    • @Harvester316 所以:像解决任何其他类型一样解决它。在这种情况下,即System.Reflection,因此要么在顶部添加using System.Reflection;,要么明确使用System.Reflection.BindingFlags。另外:只需按 ctrl+。将自动为您解决此问题(让您选择采用哪种方法)
    • 非常感谢马克。它是活生生的。 asp.net 的新手。我使用记事本++,所以 ctrl+ 对我不起作用。顺便说一句,不知道为什么我的问题被低估了。我想我不清楚或太愚蠢,以至于有些人无法友善。哎呀。谢谢马克!!
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多