C#中可以通过反射分析元数据来解决这个问题,示例代码如下:
代码语言:javascript复制using System;
using System.Reflection;
namespace Hello
{
class Program
{
static void Main(string[] args)
{
if (IsMethodDefined(typeof(Utils), "HelloWorld"))
{
Console.WriteLine("Utils类中有方法HelloWorld");
}
else
{
Console.WriteLine("Utils类中没有方法HelloWorld");
}
Console.ReadKey();
}
/// <summary>
/// 判断一个类中有无"指定名称"的方法
/// </summary>
/// <param name="type"></param>
/// <param name="methodName"></param>
/// <returns></returns>
static bool IsMethodDefined(Type type,string methodName)
{
bool result = false;
foreach (MemberInfo m in type.GetMembers())
{
if (m.Name == methodName)
{
result = true;
break;
}
}
return result;
}
}
public static class Utils
{
public static void HelloWorld()
{
Console.WriteLine("Hello World!");
}
}
}
在obj-C中,则是通过选择器selector来判断的
Sampe.h
代码语言:javascript复制#import <Foundation/Foundation.h>
@interface Sample : NSObject {
}
-(void) print:(NSString*) msg;
@end
Sample.m
代码语言:javascript复制#import "Sample.h"
@implementation Sample
-(void) print:(NSString*) msg
{
NSLog(@"%@",msg);
}
@end
main函数:
代码语言:javascript复制#import <Foundation/Foundation.h>
#import "Sample.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Sample *s = [Sample new];
if ([s respondsToSelector:@selector(print:)]) //这一行就是判断实例s中有没有方法print
{
[s print:@"Hello World"];
}
else
{
NSLog(@"%@",@"Sample类中没有定义方法print");
}
[s release];
[pool drain];
return 0;
}