Cómo usar el método de reflexión para llamar por nombre

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); }