Main Content

反射を使用した .NET ジェネリック メソッドの表示

関数 showGenericMethods

関数 showGenericMethods は .NET オブジェクトまたは完全修飾クラス名を読み取り、特定のクラスまたはオブジェクトのジェネリック メソッド名の cell 配列を返します。以下のような MATLAB® 関数を作成します。

function output = showGenericMethods(input)
% if input is a .NET object, get MethodInfo[]
if IsNetObject(input)
    methods = GetType.GetMethods(input);
    % if input is a string, get the type and get get MethodInfo[]
elseif ischar(input) && ~isempty(input)
    type = getType(input);
    if isempty(type)
        disp(strcat(input,' not found'))
        return
    end
    methods = GetMethods(type);
else
    return
end
% generate generic method names from MethodInfo[]
output = populateGenericMethods(methods);

end
function output = populateGenericMethods(methods)
% generate generic method names from MethodInfo[]
index = 1;
for i = 1:methods.Length
    method = methods(i);
    if method.IsGenericMethod
        output{index,1} = method.ToString.char;
        index = index + 1;
    end
end
end
function result = IsNetObject(input)
% Must be sub class of System.Object to be a .NET object
result = isa(input,'System.Object');
end
function outputType = getType(input)
% Input is a string representing the class name
% First try the static GetType method of Type handle.
% This method can find any type from 
% System or mscorlib assemblies
outputType = System.Type.GetType(input,false,false);
if isempty(outputType)
    % Method to get the type failed.
    % Manually look for it in
    % each assembly visible to MATLAB
    assemblies = System.AppDomain.CurrentDomain.GetAssemblies;
    for i = 1:assemblies.Length
        asm = assemblies.Get(i-1);
        % Look for a particular type in the assembly
        outputType = GetType(asm,input,false,false);
        if ~isempty(outputType)
            % Found the type - done
            break
        end
    end
end
end

クラス内でのジェネリック メソッドの表示

NetDocGeneric アセンブリにはジェネリック メソッドをもつクラスが含まれています。

dllPath = fullfile('c:','work','NetDocGeneric.dll');
asm = NET.addAssembly(dllPath);
asm.Classes
ans = 
    'NetDocGeneric.SampleClass'

以下のように、SampleClass にメソッドが表示されます。

showGenericMethods('NetDocGeneric.SampleClass')
ans = 
    'K GenMethod[K](K)'
    'K GenMethodWithMixedArgs[K](K, K, Boolean)'
    'K GenStaticMethod[K](K)'
    'K GenStaticMethodWithMixedArgs[K](K, K, Boolean)'

ジェネリック クラス内でのジェネリック メソッドの表示

NetDocGeneric アセンブリにはジェネリック メソッドをもつジェネリック クラスが含まれています。

dllPath = fullfile('c:','work','NetDocGeneric.dll');
asm = NET.addAssembly(dllPath);
asm.GenericTypes
ans = 
    'NetDocGeneric.SampleGenericClass`1[T]'

以下のように、SampleGenericClass にメソッドが表示されます。

cls = NET.createGeneric('NetDocGeneric.SampleGenericClass',{'System.Double'});
showGenericMethods(cls)
ans = 
    'System.String ParameterizedGenMethod[K](Double, K)'
    'T GenMethod[T](T)'
    'K GenStaticMethod[K](K)'
    'K GenStaticMethodWithMixedArgs[K](K, K, Boolean)'
    'System.String ParameterizedStaticGenMethod[K](Double, K)'

関連するトピック