关于C#:如何得到定义了方法的类,而不是方法被调用的实例的类?

How to get the class that the method is defined, not that of the instance that the method is called?

[self class]返回被调用方法的实例的类,但是否有方法获取定义该方法的类?假设类B扩展了A,而B是B的一个实例,我希望A中有一个方法返回A而不是B,即使从B调用它也是如此。

编辑:

我试图创建一个nsObject类别,该类别具有-(void)releaseProperties方法,该方法获取该类中定义的所有属性,并为非只读对象属性设置nil。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)releaseProperties {
    unsigned int c = 0;
    objc_property_t *properties = class_copyPropertyList([self class], &c);

    for(unsigned int i = 0; i < c; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
        NSString *propertyType = [NSString stringWithUTF8String:property_getAttributes(property)];

        if([propertyType hasPrefix:@"T@"] // is an object
           && [propertyType rangeOfString:@",R,"].location == NSNotFound // not readonly
           ) {
            [self setValue:nil forKey:propertyName];
            NSLog(@"%@.%@ = %@", NSStringFromClass(cls), propertyName, [self valueForKey:propertyName]);
        }
    }
    free(properties);
}

我想在dealloc方法中使用此方法,但是类的copyPropertyList([self class],&c)不会返回在其超类中定义的属性,因此超级dealloc链不能正常工作。因此,我不想传递[自类],而是要传递正在调用特定dealoc方法的类。


我不认为有直接的方法可以做到这一点,但是您可以使用当前类调用class_getMethodImplementation_stret,以获取将要调用的方法的函数指针。然后遍历超类,用它们调用相同的函数,直到它返回不同的结果。前一个超类将是为类提供实现的超类。

编辑:对不起,我可能误解了这个问题。如果您在层次结构中查找定义具有该签名的方法的第一个超类,那么您只需遍历调用respondsToSelector:的超类,直到其中一个不存在为止。我上面描述的方法是查找提供继承实现的超类,而不是定义。

例如,类A可以定义foo:,类B可以覆盖它(它是A的子类),类C可以询问B的子类来自哪里。如果您想要提供定义的类,您需要A,并且应该使用我描述的第二种方法。如果您想要提供实现的类,那么您需要B,并且应该使用我描述的第一种方法。


我觉得[super class]可能适合你。

如果你在B中调用"EDCOX1×1"(在你想调用的任何东西中填空),你将调用一个在A中生存的方法。


类A只能提供如下方法:

1
2
3
4
- (Class) classA
{
    return [A class];
}

这是不可归纳的,但你的问题坚持一个不可归纳的答案。

这是一件很奇怪的事情。这表明你的设计有问题。我可以问你为什么要吗?你想解决什么问题?