2009-12-30 36 views
3

是否有可能在C#中按名称获取对象?C#:如何通过存储在String中的名称获取对象?

即得到this.obj0使用

string objectName = "obj0"; 
executeSomeFunctionOnObject(this.someLoadObjectByName(objectName)); 
+1

你能举一个这个名字如何映射到对象的例子吗?你在寻找一个对象实例还是一个类型?你想要现有的实例还是创建新的实例? –

回答

8

不,不是这样的。

对象没有名称 - 变量。一个对象可以被任意数量的变量引用:零,一个或多个。

什么你可以做,但是,是字段(静态或实例变量)的名称(用Type.GetField)获得和(,对于一个特定的实例,如果你正在使用的实例变量)获得这些字段的值。

根据你想要做什么,你可能也想考虑从名字到对象的字典。

+0

很少有人明确表示不能这样做,所以你可以继续前进,看看不同的方法。谢谢。 –

1

不,不是所有对象都有名称属性(对于初学者)。

但是,您可以将感兴趣的对象存储在Dictionary<string, object>中。您也可以通过名称获得控件,确切的方法取决于UI库。

0

无法按名称访问对象。尽管如此,使用反射可以实现类的所有字段和属性(如果需要,可以按名称)。如果你的对象存储在现场级变量或属性,那么这会给你想要的东西:

Type myType = typeof(MyClass); 
FieldInfo[] myFields = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

PropertyInfo[] myproperties = myType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

您也可以拨打getfield命令和getProperty(单数),并通过在一个字符串使其返回与该名称匹配的单个成员(确保检查为空)。

阅读这些网页在这种情况下,对使用的反射方法的详细信息:

GetProperty

GetProperties

GetField

GetField

0

嗯,我想你在找什么因为是Reflection.

这里你可以看到一个很好的例子: http://www.switchonthecode.com/tutorials/csharp-tutorial-using-reflection-to-get-object-information

正如前面所说的 - 对象没有名字,但你可以穿越的对象,并得到他们的类型,采取相应的行动。

此博客here展示了遍历和反射使用的一个很好的示例。

这应该是一个很好的开始。 享受!

+0

你不能遍历'所有对象'。 –

+0

@Hank,为什么不呢?看我的版本。 –

+0

yN2,OQ想要搜索所有'已加载'的对象(我认为)。这更接近垃圾收集而不是Reflection。 –

相关问题