簡體   English   中英

如何使用反射按名稱調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM