Latest web development tutorials

C # отражение (Отражение)

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

Сборка содержит модуль, который содержит типы, которые, в свою очередь, содержит элементы. Отражение предоставляет объектно пакет узлы, модули и типы.

Вы можете использовать отражение для динамического создания экземпляра типа, тип привязан к существующему объекту или получить тип из существующего объекта. Затем можно вызвать тип захода на посадку или получить доступ к его полям и свойствам.

Доводы за и против

Преимущества:

  • 1, что отражает повышение гибкости процесса и масштабируемости.
  • 2, уменьшают сцепление, увеличение способности к адаптации.
  • 3, что позволяет программе создавать и контролировать любой тип объекта, без предварительного жестко закодированы целевого класса.

Недостатки:

  • 1, проблемы с производительностью: использование по сути является отражением, поясняющая работу, когда поля и методы для доступа к гораздо медленнее, чем прямой код. Таким образом, отражение на главной гибкости и масштабируемости приложений требуют рамки, не рекомендуется общая процедура.
  • 2, использование нечетких отражений внутри программной логики, программисты хотят видеть логику в исходном коде, но отражение не будут использовать технологию исходного кода, который будет приносить проблемы с техническим обслуживанием, а также код отражения более сложный, чем соответствующий код непосредственно ,

Reflex (Отражение) использует

Reflex (Отражение) для следующих целей:

  • Это позволяет просматривать свойства во время выполнения (атрибут) информации.
  • Это позволяет обзор коллекции различных типов, а также примеры этих типов.
  • Это позволяет позднее связывание методов и свойств (свойство).
  • Это позволяет создавать нового типа во время выполнения, а затем, используя эти типы выполнения некоторых задач.

Просмотр метаданных

Мы уже упоминали в разделе выше, использование отражения (отражения) можно просмотреть свойства (атрибут) информацию.

ОбъектSystem.Reflection MemberInfoкласс должен быть инициализирован, для обнаружения свойств , связанных с классом (атрибут). Для этого, вы можете определить класс целевого объекта, следующим образом:

System.Reflection.MemberInfo информация = TypeOf (MyClass);

Следующая программа демонстрирует эту точку зрения:

с помощью системы;

[AttributeUsage (AttributeTargets.All)]
Класс HelpAttribute общественности: System.Attribute
{
   общественного чтения строки URL;

   Тема общественного строка // Тема является именованным (названные) параметры {
      получить
      {
         вернуться тему;
      }
      комплект
      {

         тема = значение;
      }
   }

   общественного HelpAttribute (строка URL) // URL является (позиционная) параметр позиционирования {
      this.Url = URL;
   }

   частная строка темы;
}
[HelpAttribute ( "Информация о классе MyClass")]
класс MyClass
{
}

пространство имен AttributeAppl
{
   класс программы
   {
      статической силы основных (String [] агдз)
      {
         System.Reflection.MemberInfo информация = TypeOf (MyClass);
         Object [] атрибуты = info.GetCustomAttributes (истина);
         для (INT I = 0; я <attributes.Length; я ++)
         {
            System.Console.WriteLine (атрибуты [я]);
         }
         Console.ReadKey ();

      }
   }
}

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

HelpAttribute

примеров

В этом примере мы будем использоватьDebugInfoсобственность , созданную в предыдущей главе, и использует отражения (Reflection) для чтения метаданных классаRectangle.

с помощью системы;
используя System.Reflection;
Пространство имен BugFixApplication
{
   // BugFix пользовательское свойство присваивается класс и его члены [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = истина)]

   DebugInfo общественного класса: System.Attribute
   {
      частное INT Bugno;
      частный застройщик строка;
      частная строка lastReview;
      Разъяснительная строка;

      общественного DebugInfo (INT Б.Г., строка DEV, строка d)
      {
         this.bugNo = BG;
         this.developer = DEV;
         this.lastReview = d;
      }

      общественное INT Bugno
      {
         получить
         {
            вернуть Bugno;
         }
      }
      публичная строка Разработчик
      {
         получить
         {
            вернуть разработчику;
         }
      }
      публичная строка LastReview
      {
         получить
         {
            вернуть lastReview;
         }
      }
      публичная строка сообщений
      {
         получить
         {
            возвращать сообщение;
         }
         комплект
         {
            сообщение = значение;
         }
      }
   }
   [DebugInfo (45, "Зара Али", "12/8/2012",
	Message = "Возвращение типа несоответствие")]
   [DebugInfo (49, "Нуха Али", "10/10/2012",
	Message = "Неиспользованные переменная")]
   класс Прямоугольник
   {
      // Переменные-члены защищены двойной длины;
      защищенный двойной ширины;
      общественный прямоугольник (двойной л, двойной вес)
      {
         длина = л;
         ширина = ш;
      }
      [DebugInfo (55, "Зара Али", "19/10/2012",
	   Message = "Возвращение типа несоответствие")]
      общественный двойной GetArea ()
      {
         вернуться длина * ширина;
      }
      [DebugInfo (56, "Зара Али", "19/10/2012")]
      общественного недействительными Дисплей ()
      {
         Console.WriteLine ( "Длина: {0}", длина);
         Console.WriteLine ( "Ширина: {0}", ширина);
         Console.WriteLine ( "Площадь: {0}", GetArea ());
      }
   } // Конец класса Rectangle  
   
   класс ExecuteRectangle
   {
      статической силы основных (String [] агдз)
      {
         Прямоугольник г = новый прямоугольник (4.5, 7.5);
         r.Display ();
         Тип Тип = TypeOf (прямоугольник);
         // Traverse класс Rectangle атрибуты Еогеасп (атрибуты объекта в type.GetCustomAttributes (ложь))
         {
            DebugInfo DBI = (DebugInfo) атрибутов;
            если (нуль! = DBI)
            {
               не Console.WriteLine ( "Ошибка №: {0}", dbi.BugNo);
               Console.WriteLine ( "Разработчик: {0}", dbi.Developer);
               Console.WriteLine ( "Последний Отзыв: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Примечания: {0}", dbi.Message);
            }
         }
         
         // Итерация метод атрибутов Еогеасп (MethodInfo м в type.GetMethods ())
         {
            Еогеасп (приписывать в m.GetCustomAttributes (истина))
            {
               DebugInfo DBI = (DebugInfo) а;
               если (нуль! = DBI)
               {
                  не Console.WriteLine ( "Ошибка №: {0}, для метода: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Разработчик: {0}", dbi.Developer);
                  Console.WriteLine ( "Последний Отзыв: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Примечания: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

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

Длина: 4,5
Ширина: 7,5
Площадь: 33,75
Ошибка No: 49
Разработчик: Нуха Ali
Последнее Отзыв: 10/10/2012
Примечания: Не используется переменная
Ошибка No: 45
Разработчик: Zara Ali
Последнее Отзыв: 12/8/2012
Примечания: Возвращаемый тип несоответствие
Ошибка No: 55, для метода: GetArea
Разработчик: Zara Ali
Последнее Отзыв: 19/10/2012
Примечания: Возвращаемый тип несоответствие
Ошибка No: 56, для метода: Дисплей
Разработчик: Zara Ali
Последнее Отзыв: 19/10/2012
Примечания: