2011-01-14 9 views
0

"RemoteManagement1"から "RemoteManagementN"に簡略化された多くのクラスがあるとします。これらの各クラスにはstaticプロパティがあり、使用するManagementClassのtypeof()に基づいて更新する必要があります。Genericsを使用してこれを最適化することはできますか?

MyProgram.Run()内での使用を容易にするためにヘルパークラスを最適化する方法はありますか?より簡単に、私はアプリの小さな実装では、私はクラス名を3つの個別の時間を指定する必要があることを意味します。

クラス名がローカルで定義されたアセンブリと競合する可能性が高く、完全な名前空間で修飾する必要があります。ステートメントを使用するトップレベルはここでは実用的ではないかもしれません。

実際に私が使っている名前空間は、WMI's ROOT.CIMV2.Win32ROOT.MICROSOFTEXCHANGEV2.Exchangeという名前空間です。

class MyProgram1 
    { 
     void Run() 
     { 
      AnnoyinglyLongNamespace.RemoteManagementClass1.MySpecialObject = 
      CreateSpecialObjectHelper(typeof(AnnoyinglyLongNamespace. 
           RemoteManagementClass1), "asdf"); 

      foreach (var item in AnnoyinglyLongNamespace. 
           RemoteManagementClass1.GetItems()) 
      { 

      } 


     } 

     SpecialObject CreateSpecialObjectHelper(Type type, string SomeText) 
     { 
      // Use reflection on type 
      // Extract attributes 
      // do stuff 
      return new SpecialObject(attribute list + sometext); 

     } 
    } 

    ///////// ------ no code below this line can be modified -------------- 

    namespace AnnoyinglyLongNamespace 
    { 
    class SpecialObject 
    { 
      public SpecialObject(string thing) 
      { } 
    } 
    class RemoteManagementClass1 : System.ComponentModel.Component 
    { 
     public static SpecialObject MySpecialObject { get; set; } 

     public static string[] GetItems() 
     { 
      List<string> ddd = new List<string>(); 
      return ddd.ToArray(); 
     } 
    } 
    class RemoteManagementClass2 : System.ComponentModel.Component 
    { 
     public static SpecialObject MySpecialObject { get; set; } 

     public static string[] GetItems() 
     { 
      List<string> ddd = new List<string>(); 
      return ddd.ToArray(); 
     } 
    } 
    class RemoteManagementClass3 : System.ComponentModel.Component 
    { 
     public static SpecialObject MySpecialObject { get; set; } 

     public static string[] GetItems() 
     { 
      List<string> ddd = new List<string>(); 
      return ddd.ToArray(); 
     } 
    } 
    class RemoteManagementClassN : System.ComponentModel.Component 
    { 
     public static SpecialObject MySpecialObject { get; set; } 

     public static string[] GetItems() 
     { 
      List<string> ddd = new List<string>(); 
      return ddd.ToArray(); 
     } 
    } 

}

+0

すべてを静的にする理由はありますか? –

+0

その静的コードは、MicrosoftのWMIコード生成ツールによって生成され、VS2010のWMIクラスによっても作成されます。 – LamonteCristo

+0

これらの 'GetItems()'メソッドはすべて空の配列を返しますか? – stakx

答えて

1

C#4のdynamicの他に、もう1つのオプションは古いリフレクションです。それは明らかに最良の選択肢ではありませんIMHO —まず、合理的なクラスを持つ方が良いでしょう。 (しかしあなたが言うように、それはオプションではありません。なぜならそれらはすべてあなたのために生成され、変更することができないからです)。

  • はあなたがタイプSystem.ComponentModel.Componentのオブジェクトxを持っていると言います。あなたはそれがRemoteManagementClassXものの1つであることを知っていますが、あなたはまだどれがどれかを知りません。

  • (あなたはxが本当にこれらのいずれかであるかどうかを確認したい場合は、のような恐ろしい何かを経由して確認してください(私は決してだろう

    x.GetType().FullName.StartsWith(
                      "AnnoyinglyLongNamespace.RemoteManagementClass")

    文字列に型名を付けることは、後であなたのコードを壊すという招待です。)

  • プロパティを見つけることxを反映、MySpecialObjectxRemoteManagementClassXクラスの1つです

    PropertyInfo pi = x.GetType().GetProperty(
                      "MySpecialObject", BindingFlags.Static | ...);

    場合は、非取り戻す必要があります-null PropertyInfo。そのPropertyInfo経由

  • 、あなたはx.MySpecialObject(使用PropertyInfo.GetGetMethodPropertyInfo.GetSetMethod)のgetsetメソッドを呼び出すことができます。これらのプロパティはすべて常に同じタイプのSpecialObjectです。したがって、setterメソッドがそれを受け入れるか、ゲッターから戻すことが期待できます。


更新—コード例:

私はそれが—それはあなたが最初の10のGetItems()項目を通過できるようにする必要がありますについてはどのように次のコードを、誇りに思っていないよもののRemoteManagementClass..静的クラス:

for (int i = 1; i <= 10; i++) 
{ 
    // get the type of a RemoteManagementClass: 
    Type rmc = 
     Assembly 
     .GetAssembly() // <- if the static classes are in the current assembly 
     .GetType("AnnoyinglyLongNamespace.RemoteManagementClass" & i.ToString()); 

    // call its GetItems method: 
    var mi = rmc.GetMethod("GetItems", BindingFlags.Static | ...); 
    var items = mi.Invoke(null, null) as string[]; 
    //^the 1st null argument is because you're calling a static method, 
    // the 2nd null argument is because you're not passing any arguments. 

    for (string item in items) // <- loops through the items of one static class 
    { 
     // ... 
    } 
} 
+0

私はヘルパーメソッドでリフレクションを使用しています。たぶん私はこのアイデアをGetItemsの拡張メソッドとして実装できますか? ...ああスナップ..静的なクラスの拡張メソッドを行うことはできませんか? – LamonteCristo

+0

@ makerofthings7では、静的かどうかにかかわらず、*任意の*メソッドの拡張メソッドを作成することはできません。おそらく、あなたは*オブジェクト*に常にそれらを指定しなければならないので、static *クラス*の拡張メソッドを持つことはできないということでした。 – stakx

+0

oops。はい、私はオブジェクトを意味しました。 – LamonteCristo

0

あなたがdynamicキーワードを使用することができます.NET 4.0を使用している場合。あなたが達成したいことをmainに書き留めれば、より多くのことを手助けする方が簡単でしょう。

関連する問題