这类似于Invoking a method using reflection on a singleton object,但它有一个更深层次的上下文。首先,我想说的是,这是一个我只是在玩弄思想的项目,这绝不是生产代码,这个项目走了一条非常不同的道路,但这个问题仍然困扰着我。
我有一个单例,它只包含对象实例(虽然非静态实例本质上也是单例,但由基单例引用)
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;但是我是在一个用户命令控制台上这样做的,这是后面的一个问题的另一个讨论;-)
,所以这里的主要问题是:如何编写递归反射函数来拆分类路径字符串,以执行方法/计算属性?
注意:假设调用已经分解为包含路径元素的有序字符串数组、方法/属性的字符串和参数的对象数组的结构。
发布于 2009-03-19 18:32:45
好吧,如果有两个数组包含每个属性/方法名称和参数,那么我认为这样的方法会起作用:
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);https://stackoverflow.com/questions/663354
复制相似问题