Разница между GetValue, GetConstantValue и GetRawConstantValue

В чем разница между методами GetValue, GetConstantValue и GetRawConstantValue в классе PropertyInfo? Документация MSDN, к сожалению, не очень понятна по этому вопросу.

Ответ 1

Оба GetConstantValue и GetRawConstantValue предназначены для использования с литералами (подумайте const в случае полей, но семантически это применимо к нескольким полям) - в отличие от GetValue, которые будут получать фактическое значение что-то во время выполнения, постоянное значение (через GetConstantValue или GetRawConstantValue) не зависит от времени выполнения - оно прямо из метаданных.

Итак, мы получаем разницу между GetConstantValue и GetRawConstantValue. По сути, последняя является более прямой и примитивной формой. Это показано главным образом для членов enum; например, если у меня был:

enum Foo { A = 1, B = 2 }
...
const Foo SomeValue = Foo.B;

то GetConstantValue of SomeValue - Foo.B; однако GetRawConstantValue of SomeValue 2. В частности, вы не можете использовать GetConstantValue, если вы используете контекст только для отражения, поскольку для этого требуется боксировать значение > , которое вы не можете сделать при использовании только для отражения.

Ответ 2

Я не знаю, что вы пытаетесь сделать. Во всяком случае, если вы просто хотите получить значение свойства с помощью отражения, вам нужно использовать GetValue. То есть что-то вроде этого:

     private string _foo = "fooValue";

     public string Foo
     {
         get { return _foo; }
         set { _foo = value; }
     }

     public void Test()
     {
         PropertyInfo pi = this.GetType().GetProperty("Foo");
         string v = (string)pi.GetValue(this, null);
     }

Обратите внимание, что если вы вызываете GetConstantValue или GetRawConstantValue в этом примере, вы получаете InvalidOperationexception, так как свойство не является константным.

Различие между GetConstantValue и GetRawConstantValue было прекрасно объяснено Marc.