2010-06-24 70 views
15

嗨我想使用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 = ??? 
} 

回答

41

沿線的東西:

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

你可能想在每個級別雖然加檢查,以確保有問題的方法確實有效,它具有正確的參數類型,並且它有正確的返回類型。這應該足以讓你開始。

+0

謝謝喬恩,我現在正在嘗試,但我ge對象結果= method.Invoke(service,new object [] {request});「 - 參數計數不匹配。 – Martin 2010-06-24 13:40:02

+0

我解決了它。你的解決方案的工作原理,但反思並沒有拿起1個參數的服務包裝。謝謝你的幫助。 – Martin 2010-07-06 08:16:19

9

下面是使用反射由對罵對象方法的一個簡單的例子:

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

如果你在.NET 4中,使用dynamic

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

您可以使用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); 
}