2010-06-24 78 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); 
}