Почему PropertyInfo.SetValue не является универсальным методом? - PullRequest
1 голос
/ 07 августа 2009

вижу подпись:

public virtual void SetValue(object obj, object value, object[] index)

Не приведет ли этот метод к распаковке и распаковке параметров?

Почему этот метод не был разработан как универсальный? Тогда компилятор может даже вывести его без штрафа за упаковку / распаковку во время выполнения.

Ответы [ 2 ]

9 голосов
/ 07 августа 2009

Это отчасти связано с тем, что PropertyInfo.SetValue предшествует обобщению - отражение было частью .NET с самого начала.

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

Вместо того, чтобы пытаться превратить это в универсальный метод (который, возможно, в любом случае должен был бы привести к неуниверсальной реализации из-за поведения во время выполнения), команда CLR позаботилась о том, чтобы все объекты, включая типы значений , работать как System.Object. Да, это вызывает бокс, но с учетом издержек отражения небольшие дополнительные издержки бокса с типом значения не вызывают особого беспокойства.

7 голосов
/ 07 августа 2009

Если бы он был универсальным, для вызова метода тип должен быть известен во время компиляции; который победил бы цель использования отражения. Так что да, это может означать, что может возникнуть бокс, но объект является единственным безопасным типом, доступным для этого метода.

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