[英]How to use reflection to call method by name
嗨,我正在嘗試使用 C# 反射來調用傳遞參數並返回結果的方法。 我怎樣才能做到這一點? 我嘗試了幾件事,但沒有成功。 我習慣了 PHP 和 Python,它們可以在一行上完成,所以這對我來說很困惑。
本質上,這就是在沒有反射的情況下進行調用的方式:
response = service.CreateAmbience(request);
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 = ???
}
類似的東西:
MethodInfo method = service.GetType().GetMethod(serviceAction);
object result = method.Invoke(service, new object[] { request });
return (R) result;
不過,您可能希望在每個級別添加檢查,以確保所討論的方法實際上有效,它具有正確的參數類型,並且它具有正確的返回類型。 不過,這應該足以讓您入門。
這是使用反射按名稱調用對象方法的快速示例:
Type thisType = <your object>.GetType();
MethodInfo theMethod = thisType.GetMethod(<The Method Name>);
theMethod.Invoke(this, <an object [] of parameters or null>);
如果您使用 .NET 4,請使用dynamic
:
dynamic dService = service;
var response = dService.CreateAmbience(request);
您可以使用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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.