Вызвать публичный метод без параметров, используя отражение - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть метод в моем пользовательском управлении:

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 ]

3 голосов
/ 19 февраля 2015

Есть много причин для получения ошибок

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;
 }
1 голос
/ 19 декабря 2011

Первый параметр MethodInfo.Invoke - это экземпляр, для которого вы хотите вызвать метод. Передайте customControl в качестве первого параметра вместо null, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...