Привет я пытаюсь использовать отражение 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 = ???
}
Что-то вроде:
MethodInfo method = service.GetType().GetMethod(serviceAction);
object result = method.Invoke(service, new object[] { request });
return (R) result;
Возможно, вы захотите добавить проверки на каждом уровне, чтобы убедиться, что рассматриваемый метод действительно действителен, что у него есть правильные типы параметров и что он имеет правильный результат. тип. Однако этого должно быть достаточно, чтобы вы начали.
Вы можете использовать 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);
}
Если вы на .NET 4, используйте dynamic
:
dynamic dService = service;
var response = dService.CreateAmbience(request);
Вот быстрый пример вызова метода объекта по имени с использованием отражения:
Type thisType = <your object>.GetType();
MethodInfo theMethod = thisType.GetMethod(<The Method Name>);
theMethod.Invoke(this, <an object [] of parameters or null>);