如何在运行时将方法附加到动态创建的C#类型?

如何在运行时将方法附加到动态创建的C#类型?,c#,reflection,dynamic-languages,C#,Reflection,Dynamic Languages,我一直在使用一个内部数据访问库,该库实际上是XML传递给存储过程的,该存储过程返回XML。对此我无能为力。我试图让ActiveRecord获得批准,但我的请求被拒绝。然而,使用上提供的优秀代码,我向IEnumerable添加了一个扩展方法,该方法将我从粗糙的XML中生成的键值对转换为强类型对象,并包含属性名 这: 变成 MyObject.keyName1 现在接口支持数据绑定!很酷!不过,我想更进一步。我希望发出的对象也有Save()方法,这样我就可以模仿ActiveRecord模式,为我的w

我一直在使用一个内部数据访问库,该库实际上是XML传递给存储过程的,该存储过程返回XML。对此我无能为力。我试图让ActiveRecord获得批准,但我的请求被拒绝。然而,使用上提供的优秀代码,我向IEnumerable添加了一个扩展方法,该方法将我从粗糙的XML中生成的键值对转换为强类型对象,并包含属性名

这:

变成

MyObject.keyName1
现在接口支持数据绑定!很酷!不过,我想更进一步。我希望发出的对象也有Save()方法,这样我就可以模仿ActiveRecord模式,为我的web人员提供一个直观的对象层,以便从ASP.net使用


如何在Visual Studio中以源代码编写方法,并在运行时将其附加到发出的对象?我对编写汇编或IL不感兴趣(或没有资格)。我想用C#做这个。这是我的第一个StackOverflow问题,我在公司授权的IE6上发布了这个问题,所以请温和一点。

根据我在那篇文章中收集的信息,它正在为您创建匿名类型,您正在使用它来获取值。如果是这样的话,就没有简单的方法向这些对象添加方法。但是,如果每次执行SP时XML结构都是相同的,为什么不创建一个具有所有所需属性的具体类,并使用XML填充这些对象的集合呢。这样,您就可以轻松地将所需的任何方法直接添加到类中

编辑:根据我们在评论中的讨论,这里有一个想法:

在那里的代码中,当您构建类型时,您使用的是:ModuleBuilder.DefineType。DefineType有一个重载,它接受一个要扩展的类型。因此,创建一个接口(它不必包含任何方法),当动态构建类型时,使用我链接到的重载扩展该接口。然后在执行Save()的接口上创建一个扩展方法

另一个可能感兴趣的重载需要扩展类型和接口:

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方法中使用反射来获取所有属性。

我认为这称为mix-ins,它在.net中不直接或很容易获得。然而,据我所知,这是框架设计的主要原因之一

“如果每次SP执行时XML结构都相同,“我得到BRD 1245 RFW 3456项目名称!每次使用不同属性的etc:(是的,但我确信有一个属性列表可供选择。将所有这些属性作为可空字段放入类中(如果它们是值类型)我不认为你需要使用一些疯狂的解决方案来动态构建一个类型……XML是动态生成的,我不想为每个排列维护一个具体类库。我喜欢这个编辑。我不想要求da codez,但你介意抛出一些示例代码吗在您的回答中,您是否想更好地勾勒出这个想法?恐怕您在这种情况下使用TypeBuilder会导致内存泄漏。以这种方式生成的程序集不会从当前应用程序域卸载,直到整个域卸载(意味着应用程序关闭)。
    public static class SaveExtendableExtensions
    {
          public static void Save(this ISaveExtentable ise)
          {
              //implement save functionality. 
          }
    }