2009-08-30 6 views
2

私はC#の初心者ですが、プログラミングはしていませんので少し混ぜてみてください - それはまったく意図しないことです。私はいくつかのpublicプロパティ(アクセサー/ミューテータ)を持つ "API"というかなり単純なクラスを作成しました。私はまた、クラス内の名前各プロパティの&種類のアルファベット順のリストを取得するためにリフレクションを使用してテストコンソールアプリケーション書いている:今、私は必要なものC#とリフレクション

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 
using MyNamespace;  // Contains the API class 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hi"); 

      API api = new API(1234567890, "ABCDEFGHI"); 
      Type type = api.GetType(); 
      PropertyInfo[] props = type.GetProperties(BindingFlags.Public); 

      // Sort properties alphabetically by name. 
      Array.Sort(props, delegate(PropertyInfo p1, PropertyInfo p2) { 
       return p1.Name.CompareTo(p2.Name); 
      }); 

      // Display a list of property names and types. 
      foreach (PropertyInfo propertyInfo in type.GetProperties()) 
      { 
       Console.WriteLine("{0} [type = {1}]", propertyInfo.Name, propertyInfo.PropertyType); 
      } 
     } 
    } 
} 

をすべてのプロパティとconcatsをループ方法であり、それらの値は一緒にクエリー・ストリングになります。問題は、これをAPIクラス自体の関数(可能な場合)にすることです。静的コンストラクタがこの問題を解決するための何かを持っているかどうか疑問に思っていますが、私は数日間C#で作業していましたが、それを把握することはできませんでした。

ご意見、ご提案、またはコードサンプルをお待ちしております。

答えて

5

これはstaticコンストラクタとは無関係です。あなたはstatic methodsでそれを行うことができます。

class API { 
    public static void PrintAPI() { 
     Type type = typeof(API); // You don't need to create any instances. 
     // rest of the code goes here. 
    } 
} 

あなたがでそれを呼び出すことができます。あなたはstaticメソッドを呼び出すときは、すべてのインスタンスを使用していない

API.PrintAPI(); 

更新:結果をキャッシュするには、最初の呼び出しやstatic初期化子でそれを行うことができ、次のいずれか

class API { 
    private static List<string> apiCache; 
    static API() { 
     // fill `apiCache` with reflection stuff. 
    } 

    public static void PrintAPI() { 
     // just print stuff from `apiCache`. 
    } 
} 
+0

私が必要とまさに何が - ありがとうございました! もう一つ質問:私は次のことを示唆した以前のStackOverflowの質問に出くわした:あなたは、特定の属性をサポートするすべてのタイプを見つけることが反映されている..when「 \t、 \tあなたがキャッシュを使用するのに最適な機会を持っています。つまり、実行時に \tのリフレクションを複数回使用する必要はありません。 \t これは私がやりたいことを説明しているようですが、ロード時にこれを行うにはどうすればよいかわかりません。助言がありますか? –

+1

AspNycは、Mehrdadが記述したPrintApiメソッドの結果をArrayListやジェネリックバージョンList <>などのコレクションに格納するだけで、キャッシュを作成するだけです。あなたがコレクションまたはキャッシュを保存または保持する場所は、あなた次第です。照会したオブジェクトの内部または照会を開始したクライアント・コードの内部にある可能性があります。 –

+0

パーフェクト - ありがとう! –

関連する問題