Итерировать по полям объекта в C # - PullRequest
1 голос
/ 01 сентября 2011

Foo - это класс с большим количеством строковых полей. Я хочу создать метод Wizardify, который выполняет операцию над многими полями объекта. Я мог бы сделать это так:

Foo Wizardify(Foo input)
{
    Foo result;
    result.field1 = Bar(input.field1);
    result.field2 = Bar(input.field2);
    result.field3 = Bar(input.field3);
    ...

Это некоторый легко генерируемый код, но я предпочитаю не тратить на это пятьдесят строк. Есть ли способ пройти через выбранные поля объекта? Обратите внимание, что есть четыре или пять полей, над которыми я хочу работать по-другому, и они должны быть исключены из итерации.

Ответы [ 4 ]

5 голосов
/ 01 сентября 2011

try

foreach ( FieldInfo FI in input.GetType().GetFields () )
{
    FI.GetValue (input)
    FI.SetValue (input, someValue)
}

Хотя я бы не рекомендовал подход отражения для известных типов - он медленный и в зависимости от вашего конкретного сценария может вызвать проблемы с правами доступа во время выполнения ...

0 голосов
/ 01 сентября 2011

Это то, что у меня есть - оно дает мне список (имена) всех свойств в моих классах, чтобы позже я мог работать с отражением или «деревьями выражений»:

private static string xPrev = "";
        private static List<string> result;

        private static List<string> GetContentPropertiesInternal(Type t)
        {
            System.Reflection.PropertyInfo[] pi = t.GetProperties();

            foreach (System.Reflection.PropertyInfo p in pi)
            {
                string propertyName = string.Join(".", new string[] { xPrev, p.Name });

                if (!propertyName.Contains("Parent"))
                {
                    Type propertyType = p.PropertyType;

                    if (!propertyType.ToString().StartsWith("MyCms"))
                    {
                        result.Add(string.Join(".", new string[] { xPrev, p.Name }).TrimStart(new char[] { '.' }));
                    }
                    else
                    {
                        xPrev = string.Join(".", new string[] { xPrev, p.Name });
                        GetContentPropertiesInternal(propertyType);
                    }
                }
            }

            xPrev = "";

            return result;
        }

        public static List<string> GetContentProperties(object o)
        {
            result = new List<string>();
            xPrev = "";

            result = GetContentPropertiesInternal(o.GetType());

            return result;
        }

Использование: List<string> myProperties = GetContentProperties(myObject);

0 голосов
/ 01 сентября 2011

Вы можете использовать Dynamic Language Runtime для генерации лямбды типа Func .Вам просто нужно будет сгенерировать лямбду один раз (вы можете ее кэшировать), и производительность отражений не пострадает.

0 голосов
/ 01 сентября 2011

Прокрутите typeof(YourType).GetProperties() и наберите GetValue или SetValue.

Обратите внимание, что отражение довольно медленное.

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