假设我有一些MyObject obj
对象,并且想要访问该对象的一个属性,例如obj.SomeCollection.SomeProperty
。是否有可能通过组合obj和。somecollection来获得这个对象的属性。SomeProperty表示为字符串而不调用任何反射函数为这个特定的步骤?
更新:我试图避免反射的原因是由于巨大的性能影响。基本上,我将使用反射来提取其组成部分的字符串表示,并将它们存储在某种字典中,从那时起将被重用,从而避免每次需要访问对象的属性时使用反射。我之所以如此担心性能,是因为我需要使用这个过程(如果存在的话)进行企业级系统单元测试。对于反射,这种用法变得不现实,因为运行这些测试可能需要一个小时。希望这能解释我的立场。
虽然我倾向于同意@Scott(为什么不使用Reflection,非常适合这个…),如果您可以将对象序列化为XML,或者甚至更好的XML数据集,您可以使用各种选项来协商对象与字符串作为标识符。
以下编辑在@乌克兰火车2评论后发布的评论:性能
@Ukraine Train,反射和XML序列化都不是真正的性能狗。"性能"取决于您想要处理多少次迭代以及您想要处理它们的速度。一旦通过反射或XML序列化完成对象的实例化,对象就会"在内存中",所有访问都将通过指针进行。你想一次在内存中驻留多少对象,你想让它们存活多长时间都是战略决策,我没有足够的信息来给你建议。
如果您希望能够使用字符串标识符查询对象,您的选择基本上是反射或序列化。当你称反射为"巨大的"时,我相信你高估了反射对性能的影响。你能最快完成的事情就是什么都不做,其他任何事情都需要时间和资源。
您可以使用dynamic
关键字,这是c# 4中的新功能。这允许您使用在编译时未知的对象的方法和属性。你可以在MSDN上读到它,但基本用法是:
public static void Main()
{
// Instantiate or retrieve your object into memory
dynamic obj = RetrieveCustomObject();
// Invoke methods on object not known at compile time
int id = obj.Id;
bool result = obj.DoWork();
}
只要实例方法存在并且可以在运行时解析,它们就会成功执行。如果它们不存在,将抛出运行时异常。
这并不像您所要求的那样使用对象方法的字符串表示,但无论如何都值得考虑。就性能而言,这个应该可以与所描述的其他方法进行比较。但是,您应该对您的应用程序进行概要分析,以验证您选择的任何方法。