使用反射调用不带参数的公共方法

时间:2011-12-19 18:30:14

标签: c# reflection user-controls

我的用户控件中有一个方法:

public string ControleIdContainer()
{
   string abc = "Hello";
   return abc;
}

现在我想使用反射在我的页面上调用此方法。我试过这个但是没有用:

DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath("~/UserControls"));
FileInfo[] controlsInfo = dirInfo.GetFiles("*.ascx");
foreach (var item in controlsInfo)
{
    var customControl = LoadControl(string.Format("~/UserControls/{0}", item));
    var controlType = customControl.GetType();
    var controlClientScript = controlType.GetMethod("ControleIdContainer").Invoke(null,null);
}

2 个答案:

答案 0 :(得分:3)

获取错误的原因有很多

<强> 1。原因1

您没有将Invoke内的类实例作为第一个参数。代码应该是

var controlClientScript = controlType.GetMethod("MethodName").Invoke(classInstance,null);

<强> 2。原因2

可以有多个方法具有相同的方法名称(重载方法)。在这种情况下,它将显示以下错误。

  

未处理的类型异常   发生'System.Reflection.AmbiguousMatchException'。模棱两可的比赛   找到。

所以你需要指定你正在调用没有参数的方法。使用以下代码。

MethodInfo mInfo = classInstance.GetType().GetMethods().FirstOrDefault
                (method => method.Name == "MethodName"
                && method.GetParameters().Count() == 0);
mInfo.Invoke(classInstance, null);

第3。原因3

如果使用Type.GetType获取类类型,如果类在另一个程序集中,Type.GetType将为null。在这种情况下,您可以遍历Assemblies。请使用以下代码。

Type type = GetTheType("MyNameSpace.MyClass");
object objMyClass = Activator.CreateInstance(type);
MethodInfo mInfo = ojMyClass.GetType().GetMethods().FirstOrDefault
                   (method => method.Name == "MethodName"
                   && method.GetParameters().Count() == 0);
mInfo.Invoke(objMyClass, null);

GetTheType方法就在这里。 GetTheType的参数必须为Fully Qualified Name

 public object GetTheType(string strFullyQualifiedName)
 {
        Type type = Type.GetType(strFullyQualifiedName);
        if (type != null)
            return Activator.CreateInstance(type);
        foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = asm.GetType(strFullyQualifiedName);
            if (type != null)
                return Activator.CreateInstance(type);
        }
        return null;
 }

答案 1 :(得分:1)

MethodInfo.Invoke的第一个参数是您要调用该方法的实例。将customControl作为第一个参数而不是null,它应该有效。