Hola, estoy intentando usar la reflexión de C # para llamar a un método al que se le pasa un parámetro y, a cambio, devuelve un resultado. ¿Cómo puedo hacer eso? He intentado un par de cosas pero sin éxito. Estoy acostumbrado a PHP y Python, donde esto se puede hacer en una sola línea, así que esto es muy confuso para mí.
En esencia, así es como se haría la llamada sin reflexión:
response = service.CreateAmbience(request);
solicitud tiene estos objetos:
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"]);
Esta es mi función para implementar la reflexión donde serviceAction para el caso anterior sería “CreateAmbience”:
public static R ResponseHelper(T request, String serviceAction) { ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient(); R response = default(R); response = ??? }
Algo como:
MethodInfo method = service.GetType().GetMethod(serviceAction); object result = method.Invoke(service, new object[] { request }); return (R) result;
Sin embargo, es posible que desee agregar controles en cada nivel para asegurarse de que el método en cuestión sea realmente válido, que tenga los tipos de parámetros correctos y que tenga el tipo de devolución correcto. Esto debería ser suficiente para comenzar.
Aquí hay un ejemplo rápido de llamar a un método de objeto por nombre usando reflexión:
Type thisType = .GetType(); MethodInfo theMethod = thisType.GetMethod(); theMethod.Invoke(this, );
Si estás en .NET 4, usa dynamic
:
dynamic dService = service; var response = dService.CreateAmbience(request);
Puede usar Delegate.CreateDelegate para obtener un delegado al método por nombre:
public static R ResponseHelper(T request, string serviceAction) { var service = new ContentServiceRef.CMSCoreContentServiceClient(); var func = (Func)Delegate.CreateDelegate(typeof(Func), service, serviceAction); return func(request); }