Использование строк для выбора свойств объекта - PullRequest
1 голос
/ 24 июня 2009

У меня небольшая проблема с программой на C #, которую я пишу, и было бы здорово, если бы кто-то мог помочь.

Фон такой, не очень важный, но вот почему мне нужно выяснить, как это сделать:

Я использую веб-службы базы данных для получения информации о записи в базе данных. Каждый доступ к базе данных возвращает объект с множеством свойств. Используя идентификатор записи базы данных, вы сообщаете ей, какую информацию вы хотите заполнить об объекте, который она возвращает, заполняя массив, какие свойства должны быть получены. Любое свойство, отсутствующее в массиве, остается как его значение по умолчанию (обычно ноль)

Проблема: Я хочу, чтобы пользователь мог выбрать свойство объекта (не получить значение, просто выберите какое свойство), как показано ниже:

projectFields[0] = Primavera.Ws.P6.Project.ProjectFieldType.(project_properties.Text);

Где project_properties.Text - это строка имени свойства, которое я хочу установить для projectFields [0].

Кто-нибудь может помочь? Заранее спасибо:)

Редактировать: Спасибо за ответ, ребята. Хотя они позволяют мне извлекать значение из объектов динамически, это не совсем то, что я искал ... Я не пытаюсь получить значение, я только пытаюсь установить, какое свойство ProjectFields [0] является равных тоже. например, предположим, что пользователь выбирает Id в качестве информации, которую он хочет вернуть о проекте. Для этого я бы установил:

projectFields [0] = Primavera.Ws.P6.Project.ProjectFieldType.Id;

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

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

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Вы, вероятно, можете достичь того, чего хотите, с помощью Reflection ( пример ), но у меня есть отчетливое ощущение, что может быть проблема с дизайном вашей системы.

2 голосов
/ 24 июня 2009

C # - статически типизированный язык. Компилятор хочет знать ваше свойство, которое вы имеете в виду во время компиляции .

Тем не менее, вы можете сделать это с отражением, если хотите. В качестве альтернативы, если вы заранее знаете тип данных, вы можете использовать оператор switch. (Пример обоих подходов.)

using System;
using System.Reflection;

public class Demo
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}

public class Test
{
    static void Main()
    {
        Demo demo = new Demo { 
            Foo = "foo value", 
            Bar = "bar value", 
            Baz = "surprise!"
        };
        ShowProperty(demo, "Foo");
        ShowProperty(demo, "Bar");
        ShowProperty(demo, "Baz");
        ShowDemoProperty(demo, "Foo");
        ShowDemoProperty(demo, "Bar");
        ShowDemoProperty(demo, "Baz");
    }

    // Here we don't know the type involved, so we have to use reflection
    static void ShowProperty(object x, string propName)
    {
        PropertyInfo property = x.GetType().GetProperty(propName);
        if (property == null)
        {
            Console.WriteLine("No such property: {0}", propName);
        }
        else
        {
            Console.WriteLine("{0}: {1}", propName,
                                          property.GetValue(x, null));
        }
    }

    // Here we *know* it's a Demo
    static void ShowDemoProperty(Demo demo, string propName)
    {
        string value;

        // Note that this is very refactoring-unfriendly. Generally icky!
        switch (propName)
        {
            case "Foo": value = demo.Foo; break;
            case "Bar": value = demo.Bar; break;
            case "Baz": value = demo.Baz; break;
            default:
                Console.WriteLine("No such property: {0}", propName);
                return;
        }
        Console.WriteLine("{0}: {1}", propName, value);

    }
}

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

0 голосов
/ 24 июня 2009

Вы можете использовать отражение - см. информация о недвижимости класс.

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