C# Dynamic如何动态添加属性

C# Dynamic如何动态添加属性,第1张

1)定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身.

2)定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:

3) 定义一个动态对象:

需要动态属性的时候需要用到dynamic class

static class的实例不能添加动态属性

dynamic class的实例可以动态添加属性

举例:

// MovieClip是动态类

var mc:MovieClip = new MovieClip()

// 动态添加一个属性member,值为true

mc.member = true

// Sprite是静态类

var s:Sprite = new Sprite()

// 动态添加属性会报错

错误:s.member = true

第一种:runtime.h里的方法BOOL class_addProperty(Class cls,const char *name, const objc_property_attribute_t *attributes,unsigned int attributeCount) #include <objc/runtime.h> #import <Foundation/Foundation.h> @interface SomeClass : NSObject { NSString *_privateName}@end@implementation SomeClass- (id)init { self = [super init] if (self) _privateName = @"Steve" return self}@endNSString *nameGetter(id self, SEL _cmd) { Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName") return object_getIvar(self, ivar)} void nameSetter(id self, SEL _cmd, NSString *newName) { Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName") id oldName = object_getIvar(self, ivar) if (oldName != newName) object_setIvar(self, ivar, [newName copy])}int main(void) { @autoreleasepool {objc_property_attribute_t type = { "T", "@/"NSString/"" } objc_property_attribute_t ownership = { "C", "" }// C = copy objc_property_attribute_t backingivar = { "V", "_privateName" } objc_property_attribute_t attrs[] = { type, ownership, backingivar } class_addProperty([SomeClass class], "name", attrs, 3) class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:") class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "v@:@") id o = [SomeClass new] NSLog(@"%@", [o name]) [o setName:@"Jobs"] NSLog(@"%@", [o name]) }}输出:SteveJobs 第二种:- (id)valueForUndefinedKey:(NSString *)key 第三种:static char const * const ObjectTagKey@implementation NSObject (ExampleCategoryWithProperty)@dynamic objectTag- (id)objectTag { return objc_getAssociatedObject(self, ObjectTagKey) } - (void)setObjectTag:(id)newObjectTag { objc_setAssociatedObject(self, ObjectTagKey, newObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC)}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/7912069.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存