2009-06-23 12 views
1

私は書いているC#プログラムに少し問題があります。誰かが助けてくれればうれしいでしょう。文字列を使用してオブジェクトプロパティを選択する

背景はそれほど重要ではない、このですが、私はそれを行う方法を把握する必要があり、なぜそれがです:

私は、データベース内のエントリに関する情報を取得するために、データベースのWebサービスを使用しています。データベースへのアクセスごとに、多くのプロパティを持つObjectが返されます。データベースエントリのIDを使用して、取得するプロパティの配列を入力することによって返されるオブジェクトについて、どの情報を入力するかを指定します。配列内にないプロパティはデフォルト値(通常はnull)のままです。

問題: ユーザーがオブジェクトのプロパティを選択できるようにしたい(値を取得せず、単にプロパティを選択する)以下:

project_properties.Text私はprojectFields [0]に設定するプロパティの名前の文字列である
projectFields[0] = Primavera.Ws.P6.Project.ProjectFieldType.(project_properties.Text); 

誰でも手助けできますか?おかげでアドバンス:

編集:回答者のおかげで:彼らはオブジェクトの価値を動的に得ることができますが、それは私が探していたものではありません。私は値を取得するつもりはありません。私は、projectFields [0]のどのプロパティを設定するか探しています。同じです。たとえば、ユーザーがプロジェクトについて返す情報としてIdを選択したとします。これを行うには、私は次のように設定します:

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

私はデータベースに電話をかけ、プロジェクトのObjectを取得して戻しました。プロジェクトのIDは他のすべてのプロパティをデフォルトにしています。基本的には、もし私がこれらの例が示唆するようにしたら、オブジェクトのすべてのプロパティを最初に取得してから、ユーザーが興味を持っているメンバーにアクセスしなければなりません。それをやろうとしている。

データベースがどのようにアクセスされているのか不思議ですが、Webサービスを使用しているため、データベースへの呼び出しについて何も変更するオプションがありません。

+0

確かに重複しています...探しています... –

答えて

4

は、おそらくあなたはリフレクション(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); 

    } 
} 

私はこれはおそらく少し怖い設計を示している示唆他の回答に同意する...

関連する問題