2009-04-02 4 views
7

私は、事実上、XMLを返すストアドプロシージャにXMLを渡す社内データアクセスライブラリを使用して抱かれています。これについて私ができることは何もありません。私はActiveRecordを承認しようとしましたが、私の要求は拒否されました。しかし、http://blog.bodurov.com/Post.aspx?postID=27で提供されている優秀なコードを使用して、私は不自然なXMLから抜け出したキーと値のペアを、厳密に型指定されたオブジェクトに戻し、プロパティ名で完成させるIEnumerableに拡張メソッドを追加しました!実行時に動的に作成されたC#型にメソッドをアタッチするにはどうすればよいですか?

この:

dict["keyName1"] 

は今インターフェースがデータバインディングをサポートしています

MyObject.keyName1 

になります!かなりクール!私はそれをさらに進めたいと思います。私は、オブジェクトをSave()メソッドを持つようにしたいので、ActiveRecordパターンを援用し、ASP.netから使用する直感的なオブジェクトレイヤーをWebユーザに提供することができます。

は、どのように私は、ソースコードでは、Visual Studioの方法を記述し、放出されたオブジェクトに、実行時にそれを添付していますか?私はアセンブリやILを書くことに興味がない(または資格がある)。私はC#でこれをやりたいと思います。これは私の最初のStackOverflowの質問です。私は会社の要求するIE6でこれを投稿していますので、優しくしてください。

答えて

2

私はそれがあなたのために匿名型を作成しています、そしてあなたが値を取得することを使用している、その記事に集まったものから。その場合、それらのオブジェクトにメソッドを追加する簡単な方法はありません。ただし、SPが実行されるたびにXML構造が同じである場合は、必要なすべてのプロパティを持つ具象クラスを作成し、それらのオブジェクトのコレクションをXMLで埋め込むことをおすすめします。そのように、あなたは簡単にあなたがクラスに直接必要なすべてのメソッドを追加することができます...

EDIT:あなたが構築しているとき、そこにコードで

:コメント欄で私たちの議論に基づいて、ここで考えたのですタイプを使用すると、ModuleBuilder.DefineTypeが使用されます。拡張する型を取るDefineTypeのオーバーロードがあります。 Link.。したがって、インターフェイスを作成してください(イベントにはメソッドがなくてもかまいません)。タイプを動的に構築する場合は、リンク先のオーバーロードを使用してそのインターフェイスを拡張します。次に、そのインターフェイス上にSave()を実行する拡張メソッドを作成します。

あり拡張する型を取る興味のある他の過負荷だとインターフェース:

http://msdn.microsoft.com/en-us/library/f53tx4x8.aspx

EDIT2:コードサンプル:

まず、インターフェイスを作成する:

public interface ISaveExtentable //I suck at naming stuff :-p 
{ 

} 

その後、あなたはそのサイト内に言っていたコードで、あなたはと呼ばれる方法を見つけることができます:GetTypeBuilderを。その後

 private static TypeBuilder GetTypeBuilder(string typeSigniture) 
     { 
      AssemblyName an = new AssemblyName("TempAssembly" + typeSigniture); 
      AssemblyBuilder assemblyBuilder = 
       AppDomain.CurrentDomain.DefineDynamicAssembly(
        an, AssemblyBuilderAccess.Run); 
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); 

      TypeBuilder tb = moduleBuilder.DefineType("TempType" + typeSigniture 
           , TypeAttributes.Public | 
           TypeAttributes.Class | 
           TypeAttributes.AutoClass | 
           TypeAttributes.AnsiClass | 
           TypeAttributes.BeforeFieldInit | 
           TypeAttributes.AutoLayout 
           , typeof(object), new Type[] {typeof(ISaveExtentable)}); 
      return tb; 
     } 

、保存を行うためにそのインターフェイス上で拡張メソッドを作成します。:これにそれを変更するには、最も可能性のすべてを取得するためにあなたのSaveメソッドでリフレクションを使用する必要があります

public static class SaveExtendableExtensions 
    { 
      public static void Save(this ISaveExtentable ise) 
      { 
       //implement save functionality. 
      } 
    } 

をタイプが動的に作成されたため

+0

を、私はプロジェクトの BRD 1245 RFW 3456名を取得し、 "XML構造はSPが実行されるたびに同じになる場合"! など毎回属性が異なる:( –

+0

はい、確かに選択可能な属性のリストがあります。これらの属性をすべてNullableフィールドとして(値型の場合)あなたが戻ってきたものだけを移入します。私は、タイプを動的に構築するためにいくつかのクレイジーなソリューションを使う必要はないと思っています... – BFree

+0

XMLは動的に生成され、 –

1

これは、直接または簡単に.netで利用できないミックスインと呼ばれていると思います。しかし、私が理解しているように、これはLinFuフレームワークが設計された主な理由の1つです。

関連する問題