2010-06-24 19 views
15

Hola, estoy tratando de usar la reflexión C# para llamar a un método que se 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í.Cómo utilizar el método de reflexión para llamar por nombre

En esencia, esto es cómo se hizo 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"]); 

Ésta es mi función para poner en práctica la reflexión, donde serviceAction para el caso anterior sería "CreateAmbience":

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

Respuesta

41

Algo así como:

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

Es posible que también desee agregar controles en cada nivel, sin embargo, para asegurarse de que el método en cuestión es realmente válida, que tiene los tipos de parámetros correctos, y que tiene el tipo de retorno derecha. Esto debería ser suficiente para comenzar.

+0

Gracias Jon, lo estoy intentando en este momento pero me t un error en la línea "object result = method.Invoke (service, new object [] {request});" - Desajuste del conteo de parámetros. – Martin

+0

Lo he resuelto. Su solución funciona, pero el reflejo no recogió el contenedor de servicio que tomó 1 argumento. Gracias por tu ayuda. – Martin

9

Aquí está un ejemplo rápido de llamar a un método de objeto por su nombre utilizando la reflexión:

Type thisType = <your object>.GetType(); 
MethodInfo theMethod = thisType.GetMethod(<The Method Name>); 
theMethod.Invoke(this, <an object [] of parameters or null>); 
3

Si estás en .NET 4, utilice dynamic:

dynamic dService = service; 
var response = dService.CreateAmbience(request); 
3

Se puede utilizar para obtener Delegate.CreateDelegate un delegado al método por su nombre:

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