Динамически получать значения свойств индекса в C # - PullRequest
1 голос
/ 06 марта 2010

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

С моей текущей реализацией у меня возникают проблемы с Свойства индекса . Метод Object.GetType предоставляет механизм для указания массива свойств индекса, но я не уверен, как его использовать, чтобы получить все значения для свойства. В настоящее время я хотел бы объединить все значения в одну строку с разделителями.

private static SortedList<string, string> IterateObjProperties(object obj)
{
    IDictionaryEnumerator propEnumerator = ObjPropertyEnumerator(obj);
    SortedList<string, string> properties = new SortedList<string, string>();

    while (propEnumerator.MoveNext())
    {
        properties.Add(propEnumerator.Key.ToString(),
            propEnumerator.Value is String
            ? propEnumerator.Value.ToString() : String.Empty);
    }

    return properties;
}

private static IDictionaryEnumerator ObjPropertyEnumerator(object obj)
{
    Hashtable propertiesOfObj = new Hashtable();
    Type t = obj.GetType();
    PropertyInfo[] pis = t.GetProperties();

    foreach (PropertyInfo pi in pis)
    {
        if (pi.GetIndexParameters().Length == 0)
        {
            propertiesOfObj.Add(pi.Name,
              pi.GetValue(obj, Type.EmptyTypes).ToString());
        }
        else
        {
            // do something cool to store an index property
            // into a delimited string
        }
    }

    return propertiesOfObj.GetEnumerator();
}

Ответы [ 3 ]

2 голосов
/ 06 марта 2010

В общем, этого нельзя сделать. Индексатор - это свойство, которое принимает аргументы и может принимать любой аргумент (соответствующего типа): нет гарантии, что будет конечный набор значений:

public class DumbExample
{
  // What constitutes "all the values of" the DumbExample indexer?
  public string this[string s] { get { return s; } }
}

Некоторые классы могут предоставлять способ обработки действительных входных данных для индексатора (или получателя индексатора), например, Dictionary<TKey,TValue>.Keys (здесь, конечно, набор индексаторов может принимать любой TKey, но Keys, по крайней мере, дает вам действительные входные данные для геттера, что вам и нужно в этом случае), List<T>.Count и т. Д., Но это будет специфичным для класса. Таким образом, ваш код должен обрабатывать каждый из них как особый случай.

1 голос
/ 06 марта 2010

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

0 голосов
/ 27 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...