假设我有一些MyObject obj
对象,并希望访问该对象的属性,例如obj.SomeCollection.SomeProperty
。是否可以通过组合表示为字符串的obj和.SomeCollection.SomeProperty而不调用此特定步骤的任何反射函数来获取该对象的属性?
更新:我试图避免反思的原因是因为性能受到巨大打击。基本上,我将使用反射来提取其组成部分的字符串重复表示并将它们存储在某种字典中,该字典将从该点重复使用,从而避免在每次需要访问对象属性时使用反射。我之所以如此担心性能,是因为我需要使用这个过程(如果存在的话)进行企业级系统单元测试。通过反射,这种用法变得不切实际,因为运行这些测试可能需要一个小时。希望这能解释我的立场。
答案 0 :(得分:2)
虽然我倾向于同意@Scott(为什么不使用Reflection,对此完美...)如果您可以将对象序列化为XML,甚至更好的XML DataSet,您可以使用各种选项来协商带有字符串作为标识符的对象。
以下编辑发布在以下@Ukraine Train 2评论re:performance
@Ukraine Train,无论是反思还是XML序列化都不是真正的表演犬。 “性能”取决于您希望处理的迭代次数以及处理它们的速度。一旦通过反射或XML序列化对对象进行实例化,对象就会“在内存中”,所有访问都将通过指针进行。您希望一次在内存中驻留多少个对象,您希望它们存活多长时间都是战略决策我没有足够的信息来建议您。
如果您希望能够使用字符串标识符查询对象,那么您的选择几乎都是反射或序列化。当你称它为“巨大的”时,我相信你高估了反射的性能。你能做到的最快的事情就是什么,其他任何东西都需要时间和资源。
答案 1 :(得分:0)
您可以在C#4中使用dynamic
新关键字。这允许您使用在编译时未知的对象的方法和属性。您可以在MSDN here上阅读它,但基本用法是:
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();
}
只要实例方法存在且可以在运行时解析,它们就会成功执行。如果它们不存在,将抛出运行时异常。
这不会按照您的要求使用对象方法的字符串表示,但无论如何都可能值得考虑。在性能方面,这个应与所描述的其他方法进行比较。但是,您应该分析您的应用程序以验证您选择的任何方法。