Как использовать отражение для вызова метода по имени - PullRequest
18 голосов
/ 24 июня 2010

Привет. Я пытаюсь использовать отражение C # для вызова метода, которому передается параметр и, в свою очередь, возвращается результат. Как я могу это сделать? Я попробовал пару вещей, но безуспешно. Я привык к PHP и Python, где это можно сделать в одной строке, поэтому это очень смущает меня.

По сути, это то, как вызов будет сделан без отражения:

response = service.CreateAmbience(request);

запрос имеет следующие объекты:

request.UserId = (long)Constants.defaultAmbience["UserId"];
request.Ambience.CountryId = (long[])Constants.defaultAmbience["CountryId"];
request.Ambience.Name.DefaultText = (string)Constants.defaultAmbience["NameDefaultText"];
request.Ambience.Name.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["NameCulture"], (string)Constants.defaultAmbience["NameText"]);
request.Ambience.Description.DefaultText = (string)Constants.defaultAmbience["DescriptionText"];
request.Ambience.Description.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["DescriptionCulture"], (string)Constants.defaultAmbience["DescriptionDefaultText"]);

Это моя функция для реализации отражения, где serviceAction для приведенного выше случая будет "CreateAmbience":

public static R ResponseHelper<T,R>(T request, String serviceAction)
{
    ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient();
    R response = default(R);
    response = ???
}

Ответы [ 4 ]

45 голосов
/ 24 июня 2010

Что-то вроде:

MethodInfo method = service.GetType().GetMethod(serviceAction);
object result = method.Invoke(service, new object[] { request });
return (R) result;

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

11 голосов
/ 24 июня 2010

Вот краткий пример вызова метода объекта по имени с помощью отражения:

Type thisType = <your object>.GetType();
MethodInfo theMethod = thisType.GetMethod(<The Method Name>); 
theMethod.Invoke(this, <an object [] of parameters or null>); 
3 голосов
/ 24 июня 2010

Вы можете использовать Delegate.CreateDelegate , чтобы получить делегата метода по имени:

public static R ResponseHelper<T,R>(T request, string serviceAction)
{
    var service = new ContentServiceRef.CMSCoreContentServiceClient();

    var func = (Func<T,R>)Delegate.CreateDelegate(typeof(Func<T,R>),
                                                  service,
                                                  serviceAction);

    return func(request);
}
3 голосов
/ 24 июня 2010

Если вы используете .NET 4, используйте dynamic:

dynamic dService = service;
var response = dService.CreateAmbience(request);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...