首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过对象树中的反射调用单例对象上的方法

通过对象树中的反射调用单例对象上的方法
EN

Stack Overflow用户
提问于 2009-03-19 18:05:57
回答 1查看 901关注 0票数 0

这类似于Invoking a method using reflection on a singleton object,但它有一个更深层次的上下文。首先,我想说的是,这是一个我只是在玩弄思想的项目,这绝不是生产代码,这个项目走了一条非常不同的道路,但这个问题仍然困扰着我。

我有一个单例,它只包含对象实例(虽然非静态实例本质上也是单例,但由基单例引用)

代码语言:javascript
复制
    static CoreInstance()
    {
        Kernel = new Kernel();
        Devices = new Devices();
        Interfaces = new Interfaces();
        Interoperability = new Interoperability();
        Environment = new Environment();
        Data = new Data();
    }

通常情况下,这一切都很好,但它们本身通常是容器对象,例如,我可能想做以下工作:

代码语言:javascript
复制
CoreInstance.Kernel.RaiseError("I'm an error lol!", ErrorLevel.Trivial);

-或者-

代码语言:javascript
复制
string username = CoreInstance.Environment.User.FullName;

但是我是在一个用户命令控制台上这样做的,这是后面的一个问题的另一个讨论;-)

,所以这里的主要问题是:如何编写递归反射函数来拆分类路径字符串,以执行方法/计算属性?

注意:假设调用已经分解为包含路径元素的有序字符串数组、方法/属性的字符串和参数的对象数组的结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-19 18:32:45

好吧,如果有两个数组包含每个属性/方法名称和参数,那么我认为这样的方法会起作用:

代码语言:javascript
复制
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));
    }

因此,对于第一个例子,您可以这样称呼它:

代码语言:javascript
复制
string[] members = { "Kernel", "RaiseError" };
object[][] arguments = new[]{ new object[]{}, new object[]{"I'm an error lol!", ErrorLevel.Trivial}};
Execute(CoreInstance, members, arguments);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/663354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档