gusucode.com > datatypes 工具箱matlab源码程序 > datatypes/isprop.m

    function valid = isprop(varargin)
%ISPROP Returns true if the property exists.
%   V = ISPROP(H, PROP) Returns true if PROP is a property of H.
%   V is a logical array of the same size as H.  Each true element of V
%   corresponds to an element of H that has the property PROP.

%   Copyright 1988-2016 The MathWorks, Inc.

narginchk(2,3);
objQueried = varargin{1};
propName = varargin{2};

switch nargin
    case 2
        try % size may be overloaded by the object and lead to error here
            valid = false(size(objQueried));
        catch % return FALSE when SIZE is overloaded to not return numbers
            valid = false;
            return;
        end
        
        if numel(objQueried) == 1
            valid = hasProp(objQueried, propName);
        else
            % Use for-loop: input may not support ARRAYFUN (e.g. function_handle)
            for i = 1:numel(objQueried)
                valid(i) = hasProp(objQueried(i), propName);
            end
        end
    case 3 % ISPROP for class - package and class name
        try
            p = findprop(findclass(findpackage(objQueried),propName),varargin{3});
            valid = ~isempty(p) && strcmpi(p.Name,varargin{3});
        catch
            valid = false;
        end
    otherwise
        assert(false); % Number of inputs should only be the above values
end
end

function tf = hasProp( obj, propName )
try
    if ( isa(obj, 'handle') || ~isobject(obj) ) % COM is an example that returns FALSE from ISOBJECT but should go into this branch
        if isa(obj, 'double') % In case the object is casted to double
            obj = handle(obj);
            if ishghandle(obj) % graphics handle
                tf = isprop(obj, propName); % delegate to HG ISPROP overload
                return
            end
        end
        p = findprop(obj, propName); % match case sensitivity determined by the object's FINDPROP
        tf= ~isempty(p) && strcmpi(p.Name,propName); % make sure property match to the complete query text
    else % assume FINDPROP is not defined for OBJ and query METACLASS
        mc = metaclass(obj);
        if isempty(mc)  % no property
            tf = false;
        else
            tf = ~isempty( findobj(mc.PropertyList, '-depth',0,'Name', propName) );
        end
    end
catch
    tf = false;
end
end