Как я присоединяю метод к динамично созданному типу C# во времени выполнения?

Измените это:

<head>
    <title>
      <link rel="icon" href="g.png" sizes="16x16" type="image/png"> 
    </title>
</head>

на это:

<head>
    <link rel="shortcut icon" type="image/png" sizes="16x16" href="g.png"/>
</head>

Убедитесь, что ваше изображение находится в том же каталоге. <title>My page</title> - это текст, который отображается рядом со значком. В моем примере это будет «Моя страница».

7
задан Chris McCall 28 August 2009 в 21:05
поделиться

2 ответа

Из того, что я собираюсь на той статье, она создает анонимные типы для Вас, и Вы используете это для получения значений. Если это так, нет никакого простого способа включить методы к тем объектам. Однако, если структура XML будет тем же каждым разом, когда SP выполняется, почему бы не создать реальный класс, который имеет все свойства, в которых Вы нуждаетесь и заполняете набор тех объектов сами с XML. Тем путем можно легко добавить любые методы, в которых Вы нуждаетесь непосредственно в класс...

Править: На основе нашего обсуждения в комментариях вот мысль:

В коде там при создании типа Вы используете: ModuleBuilder. DefineType. Существует перегрузка к DefineType, который берет тип для расширения. Ссылка.. Поэтому создайте интерфейс (он не делает события, должны иметь любые методы в нем), и когда Вы динамично создаете тип, расширяете тот интерфейс с помощью перегрузки, я связал Вас с. Затем создайте дополнительный метод в том интерфейсе, который делает Сохранение ().

Существует другая перегрузка, которая может представлять интерес, который берет тип для расширения, и интерфейсы:

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. 
          }
    }

Необходимо будет, скорее всего, использовать отражение в методе Сохранения для получения всех свойств, так как тип был создан динамично.

2
ответ дан 7 December 2019 в 16:46
поделиться

Я думаю, что это называется подмешиванием, которое напрямую или легко не доступно в .net. Однако, насколько я понимаю, это одна из основных причин, по которой был разработан фреймворк LinFu .

1
ответ дан 7 December 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: