2009-06-23 2 views
1

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

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

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

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

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

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

Может ли кто-нибудь помочь? Спасибо в Advance :)

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

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

Затем я позвоню в базу данных, и я верну проект Object обратно, и Id будет заполнен для проекта, а все остальные свойства будут оставлены по умолчанию. В принципе, если бы я сделал это так, как предлагают эти примеры, мне нужно было бы сначала получить каждое свойство в объекте, а затем обратиться к члену, которого интересует пользователь, который будет медленным/неэффективным, если я смогу сделать так, м, пытаясь это сделать.

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

+0

Конечно, дубликат ... ищет ... –

ответ

4

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

2

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); 

    } 
} 

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

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