7

私は、XML を返すストアド プロシージャに事実上 XML が渡される社内のデータ アクセス ライブラリを使用することに悩まされてきました。これについて私にできることは何もありません。ActiveRecord の承認を取得しようとしましたが、拒否されました。しかし、http://blog.bodurov.com/Post.aspx?postID=27 で提供されている優れたコードを使用して、IEnumerableに拡張メソッドを追加しました。プロパティ名を備えた、厳密に型指定されたオブジェクト!

これ:

dict["keyName1"]

になる

MyObject.keyName1

インターフェイスがデータバインディングをサポートするようになりました!かなりクール!とはいえ、もう一歩踏み出したい。発行されたオブジェクトにも Save() メソッドを持たせたいので、ActiveRecord パターンを真似して、Web スタッフが ASP.net から直感的に使用できるオブジェクト レイヤーを提供できるようにします。

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

4

2 に答える 2

2

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

編集:コメントでの議論に基づいて、ここに考えがあります:

そこのコードでは、型を構築するときに、ModuleBuilder.DefineType を使用しています。拡張する型を取る DefineType へのオーバーロードがあります。リンク。. したがって、インターフェイスを作成し (メソッドを含める必要はありません)、型を動的に構築する場合は、リンク先のオーバーロードを使用してそのインターフェイスを拡張します。次に、そのインターフェイスで 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;
        }

次に、そのインターフェイスに拡張メソッドを作成して、保存を行います。

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

型が動的に作成されたので、Save メソッドでリフレクションを使用してすべてのプロパティを取得する必要があります。

于 2009-04-02T15:34:35.440 に答える
1

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

于 2009-11-19T17:34:02.453 に答える