我一直背负着使用内部数据访问库,它有效地将
XML传递给存储过程,该存储过程返回XML.我无能为力.我试图让ActiveRecord获得批准,但我的请求被拒绝了.但是,使用
http://blog.bodurov.com/Post.aspx?postID=27提供的优秀代码,我向IEnumerable添加了一个扩展方法,它将我从粗糙的XML中生成的键值对转换为强类型对象,并使用属性名称!
这个:
dict["keyName1"]
变
MyObject.keyName1
现在界面支持数据绑定!太酷了!不过,我想更进一步.我希望发出的对象也有Save()方法,这样我就可以模仿ActiveRecord模式,并为我的网络人员提供一个直观的对象层来使用ASP.net.
如何在Visual Studio中编写方法,在源代码中,并在运行时将其附加到发出的对象?我对编写程序集或IL不感兴趣(或有资格).我想在C#中这样做.这是我的第一个StackOverflow问题,我发布的是公司强制要求的IE6,所以请保持温和.
解决方法
从我收集的那篇文章中,它为您创建了匿名类型,并且您正在使用它来获取值.如果是这种情况,那么就没有简单的方法来为这些对象添加方法.但是,如果每次执行SP时XML结构都相同,为什么不创建具有所需属性的具体类,并使用XML自己填充这些对象的集合.这样,您可以轻松地将所需的任何方法直接添加到课程中……
编辑:基于我们在评论中的讨论,这是一个想法:
在那里的代码中,当你构建类型时,你正在使用: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; }
然后,在该接口上创建一个扩展方法来进行保存:
public static class SaveExtendableExtensions { public static void Save(this ISaveExtentable ise) { //implement save functionality. } }