Свойство / метод встраивания и влияние на отражение - PullRequest
9 голосов
/ 14 июля 2011

Мой ответ на один из вопросов о SO прокомментировал Валентин Кузуб, который утверждает, что встраивание свойства компилятором JIT приведет к тому, что отражение перестанет работать.

Случай выглядит следующим образом:

class Foo
{
    public string Bar { get; set; }

    public void Fuzz<T>(Expression<Func<T>> lambda)
    {
    }
}

Fuzz(x => x.Bar);

Fuzz функция принимает лямбда-выражение и использует отражение, чтобы найти свойство.Это обычная практика в MVC в HtmlHelper расширениях.

Я не думаю, что отражение перестанет работать, даже если свойство Bar станет встроенным, так как это вызов Bar, которыйбудет вставлено, и typeof(Foo).GetProperty("Bar") все равно вернет действительный PropertyInfo.

Не могли бы вы подтвердить это, пожалуйста, или мое понимание метода встраивания неверно?

Ответы [ 4 ]

3 голосов
/ 14 июля 2011

JIT-компилятор работает во время выполнения и не может перезаписывать метаданные, хранящиеся в сборке. И отражение читает сборку для доступа к этим метаданным. Так что нет никакого влияния JIT-компилятора на отражение.

EDIT: На самом деле, есть пара мест, когда сам компилятор C # «вставляет» некоторую информацию во время компиляции. Например, константы, перечисления и аргументы по умолчанию являются «встроенными», поэтому вы не можете получить к ним доступ во время отражения. Но это определенно не связано с вашим конкретным случаем.

1 голос
/ 14 июля 2011

Да, когда я думаю об этом больше, я полагаю, что единственный способ встраивания свойств может дать сбой. Интерфейс INotifyPropertyChanged будет работать правильно, если вы используете метод на основе отражения, например

public Count
{
get {return m_Count;}
 set { m_Count=value;
      GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();}
}

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

Хотя мы оба думаем.

0 голосов
/ 14 июля 2011

Деревья выражений не могут быть встроены в любом случае, так как они представляют собой выражение (абстрактное синтаксическое дерево), а не само выражение.

Делегаты, даже если они могут быть встроенными, все равно будут нести данные о вызываемом методе и цели в своих свойствах.

0 голосов
/ 14 июля 2011

Я лично согласен с @Sergey:

Учитывая, что встраивание происходит на стороне JIT-компилятора, но метаданные, сгенерированные ранее, не должны влиять на отражение.Кстати, хороший вопрос, нравится + 1

...