Общее решение поиска поля в классе по его имени (речь идет о поиске поля, но не свойства или метода). Для поиска свойств и методов нужно использовать соответствующие функции класса Type. Параметры BindingFlags определяют ограничения поиска (например, только видимые, относящиеся к экземпляру класса и так далее).
| Код | namespace TestReflection {
using System; using System.Reflection;
class x { public int var; }
class Program { static void Main ( string [ ] args ) {
x xInstanceFirst = new x ( ); x xInstanceSecond = new x ( ); xInstanceFirst.var = 32; xInstanceSecond.var = 64;
string class_member = "var";
FieldInfo [ ] fields = typeof ( x ).GetFields ( BindingFlags.Instance | BindingFlags.Public ); foreach ( FieldInfo fieldInfo in fields ) { if ( fieldInfo.Name.Equals ( class_member ) ) { Console.WriteLine ( fieldInfo.GetValue ( xInstanceFirst ).ToString ( ) ); Console.WriteLine ( fieldInfo.GetValue ( xInstanceSecond ).ToString ( ) ); } } } } }
|
Решение, соответствующее поставленной задаче.
| Код | namespace TestReflection {
using System; using System.Reflection;
class x {
public string getProperty ( string class_member ) { FieldInfo [ ] fields = this.GetType ( ).GetFields ( BindingFlags.Instance | BindingFlags.Public ); foreach ( FieldInfo fieldInfo in fields ) { if ( fieldInfo.Name.Equals ( class_member ) ) { return fieldInfo.GetValue ( this ).ToString ( ); } } return string.Empty; }
public int var; }
class Program { static void Main ( string [ ] args ) {
x xInstanceFirst = new x ( ); x xInstanceSecond = new x ( ); xInstanceFirst.var = 32; xInstanceSecond.var = 64;
string class_member = "var";
Console.WriteLine ( xInstanceFirst.getProperty ( class_member ) ); Console.WriteLine ( xInstanceSecond.getProperty ( class_member ) ); } } }
|
В общем случае метод getProperty должен возвращать object (в примере показано string), тогда если необходимое свойство не найдено в классе, то может возвращаться нулевой объект (либо генерироваться исключение). |