是否有一种方法可以使用其组成部分的字符串表示来构造对象,而不使用此特定步骤的任何反射



假设我有一些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();
}

只要实例方法存在并且可以在运行时解析,它们就会成功执行。如果它们不存在,将抛出运行时异常。

这并不像您所要求的那样使用对象方法的字符串表示,但无论如何都值得考虑。就性能而言,这个应该可以与所描述的其他方法进行比较。但是,您应该对您的应用程序进行概要分析,以验证您选择的任何方法。

相关内容

  • 没有找到相关文章

最新更新