2010-06-24 12 views
15

Hallo Ich versuche, C# -Reflexion zu verwenden, um eine Methode aufzurufen, die einen Parameter übergeben wird und im Gegenzug ein Ergebnis zurückgibt. Wie kann ich das machen? Ich habe ein paar Dinge ausprobiert, aber ohne Erfolg. Ich bin es gewohnt, PHP und Python, wo dies in einer einzigen Zeile erfolgen kann, so dass dies für mich sehr verwirrend ist.So verwenden Sie Reflektion zum Aufrufen von Methode nach Name

Im Wesentlichen ist dies, wie der Anruf ohne Reflexion gemacht würde:

response = service.CreateAmbience(request); 

Anfrage hat diese Objekte:

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"]); 

Diese meine Funktion ist die Reflexion, wo serviceAction für den Fall oben zu implementieren wäre "CreateAmbience":

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

Antwort

41

Etwas in der Art von:

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

Möglicherweise mögen Sie auch überprüft, obwohl auf jeder Ebene hinzuzufügen, wobei das Verfahren in Frage zu stellen Sie sicher, tatsächlich gültig ist, dass es die richtigen Parametertypen hat, und dass es den richtigen Rückgabetyp bekam. Dies sollte genug sein, um Sie jedoch zu beginnen.

+0

Danke Jon, ich probiere das gerade aus, aber ich ge t ein Fehler in der Zeile "object result = method.Invoke (service, neues Objekt [] {request});" - Parameteranzahl stimmt nicht überein. – Martin

+0

Ich habe es gelöst. Ihre Lösung funktioniert, aber die Reflektion nahm nicht den Service Wrapper auf, der 1 Argument benötigte. Danke für Ihre Hilfe. – Martin

9

Hier ist ein kurzes Beispiel für eine Objektmethode mit Namen mit Reflexion Aufruf:

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

Wenn Sie auf .NET 4, verwenden dynamic:

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

können Sie Delegate.CreateDelegate verwenden zu erhalten ein Delegierter für die Methode nach Name:

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