2015-09-08 2 views
-1

Мне нужно использовать отражение для получения значений поля или свойства для определенного типа.Как использовать отражение для получения всех полей и/или свойств для определенного типа?

Я не знаю, если

  • это поле
  • это свойство
  • либо из вышеперечисленного являются частными или публичными.

Я не могу делать предположений, поэтому я надеялся использовать отражение, чтобы решить эту проблему. Я в надежде, что разработчики сделают эти частные поля ... но я не могу этого допустить.

Как найти все поля/свойства для типа Foo, который имеет .. сказать .. int?

.NET v 4.0 или 4.5 пожалуйста. Linq также приемлемо :)

Я хочу что-то вроде этого псевдокода:

var property = source.GetType() 
        .GetProperties(BindingFlags.GetField | BindingFlags.NonPublic) 
        .Where(x => x.PropertyType == typeof (int)) 
        .ToList(); 
+0

Теперь, когда вы редактировали какой-то код, в чем проблема с этим кодом? –

+0

"sorta like this"? Что еще вы хотите? – Luaan

+0

Если вы используете 'GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)', вы получите как общедоступные, так и непубличные свойства экземпляра. Вам также нужно вызвать 'GetFields' с тем же. Вы также можете вызвать 'GetMembers', но его немного сложнее использовать, если вам нужно фильтровать типы свойств и типы полей. –

ответ

3

Что-то вроде этого

const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | 
        BindingFlags.Instance | BindingFlags.DeclaredOnly; 
PropertyInfo[] properties = yourType.GetProperties(flags); 
FieldInfo[] fields = yourType.GetFields(flags); 

var intProperties = properties.Where(x => x.PropertyType == typeof (int)); 
var intFields = fields.Where(x => x.FieldType == typeof (int)); 

Вы также можете написать это так (что ближе к примеру)

const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | 
        BindingFlags.Instance | BindingFlags.DeclaredOnly; 

var intProperties = yourType.GetProperties(flags) 
        .Where(x => x.PropertyType == typeof (int)); 

var intFields = yourType.GetFields(flags) 
       .Where(x => x.FieldType == typeof (int)); 
+0

Но - как этот фильтр отфильтровывает только один тип .. скажем, 'int' или' Foo' или что-то еще? –

+0

как вы упомянули yourType.GetProperties (flags) .Where (x => x.PropertyType == typeof (int)); и yourType.GetFields (flags) .Where (x => x.FieldType == typeof (int)); –

+0

'' fields.Where (f => f.FieldType == typeof (int)) '' –

Смежные вопросы