2015-12-10 5 views
2

Впервые я расскажу вам, что мне нужно сделать, потому что я думаю, что это не «нормальная» проблема, а довольно конкретная.Получение атрибутов класса

У меня есть класс Words, который определяет 16 пунктов. Этот класс используется в моем общем классе OldParser, потому что он определяет каждый атрибут. Вот один из моих классов выглядит с атрибутами типа Words.

class MyClass: OldParser 
{ 
    public Words[] arg1 = new Words[2]; 
    public Words[] arg2 = new Words[5]; 
    public Words arg3; 
} 

Тогда у меня есть массив слов, который содержит то, что мне нужно для создания моего класса. Итак, первые два слова пойдут на arg1. 5 других - arg2, а последний - arg3. И, конечно, мне нужно, чтобы он был общим для каждого класса, который у меня есть, поэтому он должен быть общим.

Итак, вот мой вопрос: как я могу получить список всех атрибутов моего класса? А потом, как узнать размер массива?

Например, для этого класса мне нужно получить все атрибуты и знать, что мой первый атрибут - это массив из 2, второй - массив из 5, а мои последние атрибуты - это не массив.

я использовал:

List<System.Reflection.FieldInfo> list = typeof(MyClass) 
      .GetFields(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public) 
      .ToList(); 

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

+1

Пожалуйста, смотрите [ «Должны ли вопросы включают„метки“в их названиях?»] (HTTP://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+2

Меня беспокоит использование термина * Атрибут *, который более связан с https://msdn.microsoft.com/en-us/library/z0w1kczw.aspx - вы имеете в виду флаги? ... пожалуйста, дополните! –

+0

Я смущен тем, что это за слова. Вы говорите: «первые два слова пойдут на arg1», но я не знаю, откуда эти слова? Вы просто получаете список из 6 слов, переданных в конструктор для этого объекта или что-то еще? – Chris

ответ

1

Вы можете сделать это,

var myClass = new MyClass(); 
var fieldInfos = typeof(MyClass).GetFields(); 

var myArraysAndLengths = new Dictionary<string, int>(); 
foreach (var field in fieldInfos) 
{ 
    var fieldName = field.Name; 
    var fieldValue = field.GetValue(myClass); 
    var fieldType = field.FieldType; 
    if (fieldType == typeof (Words[])) 
    { 
     var value = (Words[]) fieldValue; 
     var length = value.Length; 
     myArraysAndLengths[fieldName] = length; 
    } 
} 
0

Это может быть так. Как Myclass - это ваш собственный тип, и вы получите все свойства по методу GetFields.

FieldInfo[] fields = typeof(MyClass).GetFields(); 
foreach (FieldInfo info in fields) { 
    string[] item = (string[])info.GetValue(null); 
    Console.WriteLine("Array contains {0} items:", item.Length);  
} 
+0

[похоже, копия!] (Http://stackoverflow.com/a/3194375/3970411) – dotctor

+0

Его ответ был сначала ... Я отслеживаю эту тему. – Kixoka

-1

Поскольку поля нестатические, вы не можете получить доступ к массивам без экземпляра. После создания экземпляра вы можете сделать что-то вроде этого:

MyClass instance = ...; 

IDictionary<FieldInfo, int> arrayLengths = list.Where(field => field.FieldType.IsArray) 
    .ToDictionary(field => field, 
        field => ((Array)field.GetValue(instance)).Length); 
Смежные вопросы