2013-08-07 10 views

答えて

13

両方GetConstantValueGetRawConstantValueリテラルで使用するために意図されている(フィールドの場合constと思いますが、意味的それだけでフィールド以上に適用することができます) - GetValueとは異なり、実行時に何かの実際の値を取得することになります、一定値(GetConstantValueまたはGetRawConstantValue経由)は実行時依存ではなく、メタデータから直接です。

次に、GetConstantValueGetRawConstantValueの違いになります。基本的に、後者はより直接的かつ基本的な形式です。これは主にenumのメンバーを示しています。例えば ​​- 私が持っていた場合:

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

その後、SomeValueGetConstantValueFoo.Bです。しかし、GetRawConstantValueSomeValueであり、2である。具体的には、反射専用のコンテキストを使用している場合はボクシングの値をFooにする必要があるため、反射専用のコンテキストを使用している場合はGetConstantValueを使用することはできません。

+0

Marcあなたの説明はフィールドの 'Properties'について' GetRawConstantValue'をカバーしています。プロパティは正しくできませんか? AFAIK C#には、定数セマンティクスでプロパティを表現するためのメカニズムが含まれていないという点で、間違いがあるとすれば、「Properties」 –

+0

@SriramSakthivelの例がよく表示されます。 ILには、個々の言語より多くのものが含まれています。そうではありません。私は、生のILを書いていない、例を挙げることは可能だとは思わない。 –

+0

まあ、私の推測は正しかった、ありがとうmarc –

0

私はあなたが何をしようとしているのか分かりません。とにかく、単にリフレクションを使用してプロパティの値を取得する場合は、GetValueを使用する必要があります。私。この例ではGetConstantValueまたはGetRawConstantValueを呼び出す場合の特性が一定でないので、あなたは、InvalidOperationExceptionがを得ること

 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の違いは、Marcによって完全に説明されています。