В чем разница между методами GetValue
, GetConstantValue
и GetRawConstantValue
в классе PropertyInfo
? Документация MSDN, к сожалению, не очень понятна по этому вопросу.
Разница между GetValue, GetConstantValue и GetRawConstantValue
Ответ 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.