使用反射调用不带参数的公共方法
本文关键字:方法 参数 反射 调用 | 更新日期: 2023-09-27 18:18:13
在我的用户控件中有一个方法:
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);
}
出现错误的原因有很多
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
将为空。在这种情况下,需要通过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
的参数必须是一个完全限定名
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;
}
MethodInfo.Invoke
的第一个参数是要在其上调用该方法的实例。传递customControl
作为第一个参数,而不是null
,它应该工作。