Из того, что я собрал в этой статье, он создает анонимные типы для вас, и вы используете это для получения значений. Если это так, то нет простого способа добавить методы к этим объектам. Однако, если структура XML будет одинаковой при каждом выполнении SP, почему бы не создать конкретный класс со всеми необходимыми свойствами и заполнить коллекцию этих объектов самим XML. Таким образом, вы можете легко добавлять любые нужные вам методы непосредственно в класс ...
РЕДАКТИРОВАТЬ: Основываясь на нашей дискуссии в комментариях, вот мысль:
В этом коде при создании типа вы используете: ModuleBuilder.DefineType. Существует перегрузка для DefineType, которая принимает тип для расширения. Link. . Поэтому создайте интерфейс (он не должен содержать никаких методов), а когда вы динамически создаете тип, расширяйте этот интерфейс с помощью перегрузки, с которой я вас связал. Затем создайте метод расширения для этого интерфейса, который выполняет функцию Save ().
Существует другая перегрузка, которая может представлять интерес для расширения типа и интерфейсов:
http://msdn.microsoft.com/en-us/library/f53tx4x8.aspx
РЕДАКТИРОВАТЬ 2: Пример кода:
Сначала создайте интерфейс:
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, чтобы получить все свойства, поскольку тип был создан динамически.