GetValue,GetConstantValue和GetRawConstantValue之间的区别

时间:2013-08-07 08:52:14

标签: c# reflection

GetValue类上的GetConstantValueGetRawConstantValuePropertyInfo方法之间有什么区别?遗憾的是,MSDN文档在这个问题上并不十分清楚。

2 个答案:

答案 0 :(得分:15)

GetConstantValueGetRawConstantValue都适用于文字(在字段的情况下考虑const,但语义它不仅适用于文字字段) - 与GetValue不同,它会在运行时获得某些内容的实际值,常量值(通过GetConstantValueGetRawConstantValue)不依赖于运行时 - 它直接来自元数据。

然后我们了解GetConstantValueGetRawConstantValue之间的区别。基本上,后者是更直接和原始的形式。这主要表示enum成员;例如 - 如果我有:

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

然后GetConstantValue的{​​{1}}为SomeValue;但是,Foo.B的{​​{1}}为GetRawConstantValue。特别是,如果您使用的是仅反射上下文,则无法使用SomeValue,因为这需要装箱将值2,您不能在使用仅反射时执行。

答案 1 :(得分:0)

我不知道你要做什么。无论如何,如果您只想使用反射检索属性的值,则必须使用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,因为该属性不是常量。

Marc完全解释了GetConstantValue和GetRawConstantValue之间的区别。