classdef ClassName < dynamicprops
descriptor = addprop(obj, name)
obj = rmprop(obj, name)
| Parameter | Description |
|---|---|
| obj | a scalar classdef handle object that inherits from dynamicprops. |
| name | dynamic property name as a character vector or string scalar. |
| Parameter | Description |
|---|---|
| descriptor | dynamic property descriptor handle. |
| obj | the same handle object after removing the dynamic property. |
dynamicprops is a classdef base class for handle classes that need properties added to individual object instances at run time.
addprop(obj, name) adds a dynamic property to one object. The property can then be read and written with field access such as obj.X.
rmprop(obj, name) removes a dynamic property from one object. Declared class properties cannot be removed with rmprop.
Dynamic properties are visible through isprop, properties, object field access, metaclass, and struct conversion.
The descriptor returned by addprop is a meta.DynamicProperty handle with fields Name, DefiningClass, Dynamic, Dependent, AbortSet, GetMethod, GetObservable, Hidden, NonCopyable, SetMethod, SetObservable, Transient, GetAccess, SetAccess, and ValidationExpression.
AbortSet, Dependent, GetAccess, GetMethod, GetObservable, Hidden, NonCopyable, SetAccess, SetMethod, SetObservable, Transient, and ValidationExpression can be changed on the descriptor. GetAccess and SetAccess accept public, private, or protected. GetMethod must be empty or a function handle called as value = f(obj). SetMethod must be empty or a function handle called as f(obj, value). Dependent dynamic properties use GetMethod and SetMethod instead of stored values. ValidationExpression uses the same property validation syntax as declared properties. Hidden dynamic properties remain accessible through field access and isprop, but are omitted from properties. Non-copyable dynamic properties are omitted by copy. Transient dynamic properties are omitted from struct conversion and saved object data.
GetObservable enables PreGet and PostGet listeners for the dynamic property. SetObservable enables PreSet and PostSet listeners. AbortSet skips set notifications when the assigned value is unchanged.
Objects that inherit from dynamicprops raise PropertyAdded after adding a dynamic property and PropertyRemoved before removing one. The event data includes Source, EventName, and PropertyName.
Deleting the descriptor with delete(descriptor) removes the dynamic property from the source object.
d = [tempdir(), 'nelson_help_dynamicprops/'];
if ~isdir(d)
mkdir(d);
end
filewrite([d, '/NelsonHelpDynamicProps.m'], ["classdef NelsonHelpDynamicProps < dynamicprops"; " properties"; " Base = 1"; " end"; "end"]);
addpath(d);
obj = NelsonHelpDynamicProps();
listenerAdded = addlistener(obj, 'PropertyAdded', @(src, eventData) disp(eventData.PropertyName));
listenerRemoved = addlistener(obj, 'PropertyRemoved', @(src, eventData) disp(eventData.PropertyName));
descriptor = addprop(obj, 'Extra');
obj.Extra = 42;
descriptor.Name
descriptor.Dynamic
descriptor.SetObservable = true;
setListener = addlistener(obj, 'Extra', 'PostSet', @(src, eventData) disp(eventData.PropertyName));
obj.Extra = 43;
descriptor.GetMethod = @(x) x.Base + 10;
obj.Extra
descriptor.GetMethod = [];
descriptor.Dependent = true;
descriptor.SetMethod = @(x, value) value;
descriptor.GetMethod = @(x) x.Base;
obj.Extra = 3;
obj.Extra
descriptor.Dependent = false;
descriptor.GetMethod = [];
descriptor.SetMethod = [];
descriptor.SetAccess = 'private';
descriptor.SetAccess = 'public';
descriptor.ValidationExpression = '(1, 1) double {mustBePositive}';
descriptor.NonCopyable = true;
descriptor.Hidden = true;
isprop(obj, 'Extra')
properties(obj)
descriptor.Hidden = false;
descriptor.Transient = true;
struct(obj)
delete(descriptor);
delete(listenerAdded);
delete(listenerRemoved);
delete(setListener);
isprop(obj, 'Extra')
clear obj descriptor;
rmpath(d);
rmdir(d, 's')
| Version | Description |
|---|---|
| 2.0.0 | initial version |