Вызов методов на объекте Singleton посредством отражения в дереве объектов - PullRequest
0 голосов
/ 19 марта 2009

Это похоже на Вызов метода с использованием отражения на одноэлементном объекте , но он имеет гораздо более глубокий контекст. Во-первых, я хочу сказать, что это проект, над которым я просто поигрался с идеями, это никоим образом не является производственным кодом, и проект пошел ОЧЕНЬ по другому пути, но эта проблема все еще преследует меня, так что вот так. *

У меня есть синглтон, который содержит только экземпляры объектов (которые, хотя и нестатические, по сути тоже синглтоны, но на которые ссылается базовый синглтон)

    static CoreInstance()
    {
        Kernel = new Kernel();
        Devices = new Devices();
        Interfaces = new Interfaces();
        Interoperability = new Interoperability();
        Environment = new Environment();
        Data = new Data();
    }

обычно это было бы хорошо, но они сами часто являются объектами-контейнерами, например, я мог бы сделать следующее:

CoreInstance.Kernel.RaiseError("I'm an error lol!", ErrorLevel.Trivial);

-или-

string username = CoreInstance.Environment.User.FullName;

но я делаю это из пользовательской командной консоли, что является еще одним обсуждением для более позднего вопроса SO; -)

поэтому основной вопрос здесь таков: как написать рекурсивную функцию отражения, чтобы разделить строку пути к классу, подобную этой, для выполнения метода / оценки свойства?

Примечание: предположим, что вызов уже разбит на структуру, содержащую упорядоченный строковый массив для элементов пути, строку для метода / свойства и массив объектов для параметров.

1 Ответ

1 голос
/ 19 марта 2009

Ну, если у вас есть два массива, содержащих имена свойств / методов и параметры для каждого из них, я думаю, что-то вроде этого будет работать:

public object Execute(object target, IEnumerable<string> memberNames, IEnumerable<object[]> args)
    {
        if(memberNames.Count() == 0)
            return target;

        string currentMember = memberNames.First();
        object[] currentArgs = args.First();

        object value;

        if (currentArgs.Length == 0)
        {
            //property
            PropertyInfo pi = target.GetType().GetProperty(currentMember);
            value = pi.GetValue(target, null);
        }
        else
        {
            //method
            MethodInfo mi = target.GetType().GetMethod(currentMember);
            value = mi.Invoke(target, currentArgs);
        }

        return Execute(value, memberNames.Skip(1), args.Skip(1));
    }

Итак, для вашего первого примера вы можете назвать это так:

string[] members = { "Kernel", "RaiseError" };
object[][] arguments = new[]{ new object[]{}, new object[]{"I'm an error lol!", ErrorLevel.Trivial}};
Execute(CoreInstance, members, arguments);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...