2009-12-07 4 views
39

Многие списки вопросов в сети .Net (including the good ones) содержат вопрос: «Что такое отражение?». Недавно мне было предложено ответить на этот вопрос в контексте 5 вопросов, технических испытаний, которые должны были быть завершены за 15 минут на листе пустой бумаги, переданной мне в кафетерии. Мой ответ шел по строкам «Отражение» позволяет вам найти методы, свойства и поля любого объекта во время выполнения ». В ретроспективе, мой ответ объясняет, как вы можете использовать отражение, но это не объясняет, что такое отражение. На мой взгляд, моего ответа было достаточно, чтобы передать, что я понимаю, что такое отражение для, но не зашло так далеко, чтобы объяснить, какое отражение является.Через 3 минуты, что такое отражение?

Так что, пожалуйста, в контексте .Net, в своих кратких словах, определить, что отражение является. Не тратьте больше трех минут на ответ. Не обращайтесь к the .Net documentation, мы все это видели.

+1

"Do not spe более 3 минут, не ссылайтесь на документацию ». , , не задавайте таких вопросов. Голосование закрывается. –

+6

Вы можете закрыть его, если хотите. У меня уже есть хорошие ответы, поэтому я задал вопрос. – grenade

+0

@Binary Worrier, я, возможно, вводил в заблуждение, не ссылаясь на заявление. Я имею в виду, что ответ не должен быть «читать документы на некотором URL», а не использовать документацию, чтобы дать хороший ответ. – grenade

ответ

42

Отражение - это способность запрашивать и взаимодействовать с системой типов динамическим способом.

+0

Это хорошо! Очень кратким и «динамичным» много сказано. – grenade

+3

Но тогда это часть кода метода системы типов? Мне кажется, что вы взаимодействуете не только с системой типов –

+1

@Vinko: Методы определяются в контексте типов, поэтому я бы сказал «да», но я вижу вашу точку зрения. Честно говоря, я не ожидал охватить все детали отражения в одном предложении. –

9

Отражение - это осведомленность CLR об объектах уровня кода, таких как имена классов, методы и т. Д., Которые отображаются через API, а именно System.Reflection, что позволяет разработчику использовать информацию о времени выполнения этой информации в своем коде.

Нарушение правил: Я отредактировал этот ответ из его первоначальной формы для обеспечения точности.

+0

Отражение не требует компилятора во время выполнения. – Guge

+0

Является ли это осознанием компилятора или осознанием CLR? –

+2

На самом деле, мне нравится этот ответ, изменяющий компилятор для выполнения. –

6

Отражение похоже на военно-морской взгляд на код.

+4

Я даже хочу знать, что такое военно-морское звание? – Pondidum

+3

что-то, что связано с заправкой морских судов. –

+0

oh военно-морской флот, как я корабль ... единственное, что я мог подумать, было пупка ... – Pondidum

11

форма самоанализа, т.е. умение писать код, который запрашивает код

+4

+1 ИМО самый понятный ответ - теперь я понимаю, почему это называется «отражение» - как будто смотрит в зеркало. – jacknad

4

Мне нравится ваш ответ, но я хотел бы также отметить, что отражение также способ получения/установки частные/защищенные поля/свойства, которые бы в противном случае не будут доступны во время выполнения.

+0

Отражение действительно позволяет это, но это не одно из искупительных качеств Reflection IMO. Поля установлены на приватные по какой-либо причине: вы нарушаете инкапсуляцию с использованием Reflection как таковой, поэтому ее следует избегать, если это вообще возможно. Кроме того, этот ответ заключается в том, как использовать отражение, а не то, что такое отражение. – antik

+0

Обычно я соглашаюсь с вашими рассуждениями, но также думаю о ситуации, когда вы работаете с сторонним компонентом, у вас нет другого доступа, кроме как взломать Reflection. И да, вы правы, я просто хотел упомянуть то, что не было сказано в 5 предыдущих ответах. Я бы предпочел добавить что-то недосказанное в поток вместо повторения, даже если это означает расхождение немного с вопросом ... пока я могу добавить значение для обсуждения :) – tzup

+1

Я бы согласился, что это некрасиво, но иногда вы действительно нужно что-то от стороннего контроля. Я обнаружил утечку памяти в одном, и они не будут исправлять ее в течение нескольких месяцев, поэтому использовалось отражение, чтобы временно сделать это самостоятельно. – PeteT

5

Во время компиляции языка .Net компилятор помещает информацию о программе в файл программы. Эта информация может использоваться самой программой или другими программами, чтобы узнать, какие классы содержит программа, каковы их методы, свойства, поля и события. Классы и их методы, свойства и т. Д. Также могут быть использованы посредством отражения, даже если другая программа ничего не знает о них перед запуском. Это позволяет различным программам быть слабо связанными и делает возможным всевозможные захватывающие программы. Отражение также можно использовать для создания дополнительных классов в запущенных программах или в программных файлах.

+0

-1: На самом деле не объясняет отражение. Конечно, можно получить классы, методы и т. Д. Посредством отражения, но это больно. Гораздо проще использовать их статически. Однако отражение может использоваться для времени выполнения, а не для компиляции времени обнаружения типов и их методов. – Arafangion

+0

Arafangion, мой ответ содержит то, что такое отражение, как оно работает, как его можно использовать, и я думаю, что мой ответ на самом деле включает то, что вы предлагаете в своем комментарии. Я предлагаю вам прочитать ответы, прежде чем вы их понижаете. – Guge

+0

Guge: Строго говоря, да, однако, на самом деле это не указывает на то, как практические последствия или разница между временем компиляции и временем выполнения, и я не согласен с тем, как она позволяет свободно связываться. (В контексте .NET это не имеет никакого отношения к связи). Infact, многое из того, что вы указываете, можно сделать с помощью C и динамического компоновщика. (Вы правы, однако, это был действительно придирчивый ответ ... Возможно, не стоит нисходящего потока, однако, downvotes едва влияют на репутацию) – Arafangion

2

Отражение - это резюме кода.

+1

Вы имеете в виду _résumé_, но это выглядело слишком много для меня, как значение 'On Ошибка возобновления Next'. Нужно очистить свой разум от VB-измов. –

8

Отражение - это способность программы обрабатывать себя как данные.

+0

Просьба уточнить – graumanoz

0

Отражение - это как метаданные, так и промежуточный язык Microsoft (MSIL) вместе, завернутый в переносимый файл Exutable (PE), к которому это можно получить во время выполнения с помощью механизма.

0

Отражение - это не что иное, как возможность доступа к методу других dll, которые не были включены в ваш проект (может быть система или ваш собственный) в динамическом режиме. Также полезно избегать проблем с круговой зависимостью.

0

Отражение является способность действовать как GOD (G бщая OD военные действия irector ;-)) - вы можете «видеть» внутренностей собрания и делать различные акты (системы. Reflection), специально предназначенные для выполнения, например запросы для типов и их членов, поиск интерфейсов или атрибутов, создание типов, неизвестных во время компиляции, и даже создание новых типов (System.Reflection.Emit).

0

Используя Reflection в C#, вы можете узнать детали объекта, метод и создать объекты и вызвать методы во время выполнения.

using System; 
using System.Reflection; 

public class MyClass 
{ 
    public virtual int AddNumb(int numb1,int numb2) 
    { 
    int result = numb1 + numb2; 
    return result; 
    } 

} 

class MyMainClass 
{ 
    public static int Main() 
    { 
    // Create MyClass object 
    MyClass myClassObj = new MyClass(); 
    // Get the Type information. 
    Type myTypeObj = myClassObj.GetType(); 
    // Get Method Information. 
    MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 
    object[] mParam = new object[] {5, 10}; 
    // Get and display the Invoke method. 
    Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " + 
         myMethodInfo.Invoke(myClassObj, mParam) + "\n"); 
    return 0; 
    } 
} 

ниже код будет получить информацию о типе:

Type myTypeObj = Type.GetType("MyClass"); 

фрагмент кода ниже будет получить информацию метода;

Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 

Следующий фрагмент кода будет вызывать метод AddNumb:

myMethodInfo.Invoke(myClassObj, mParam); 
Смежные вопросы