2013-08-07 31 views

Trả lời

13

Cả GetConstantValueGetRawConstantValue được dành cho sử dụng với literals (nghĩ const trong trường hợp của các lĩnh vực, nhưng ngữ nghĩa nó có thể áp dụng cho nhiều hơn chỉ là các trường) - không giống như GetValue đó sẽ nhận được giá trị thực tế của một cái gì đó trong thời gian chạy, một giá trị không đổi (thông qua GetConstantValue hoặc GetRawConstantValue) không phụ thuộc vào thời gian chạy - nó là trực tiếp từ siêu dữ liệu.

Vì vậy, chúng tôi nhận được sự khác biệt giữa GetConstantValueGetRawConstantValue. Về cơ bản, sau này là hình thức trực tiếp và nguyên thủy hơn. Điều này hiển thị chủ yếu cho các thành viên enum; ví dụ - nếu tôi đã có một:

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

thì GetConstantValue của SomeValueFoo.B; tuy nhiên, số GetRawConstantValue của SomeValue2. Cụ thể, bạn không thể sử dụng GetConstantValue nếu bạn đang sử dụng ngữ cảnh chỉ phản chiếu, vì điều đó sẽ yêu cầu boxing giá trị cho một số Foo mà bạn không thể thực hiện khi chỉ sử dụng tính năng phản chiếu.

+0

Marc giải thích của bạn bao gồm 'GetRawConstantValue' cho các trường về' Properties'. Thuộc tính không thể đúng? Nếu bạn nhầm, bạn có thể hiển thị một ví dụ với 'Properties' –

+0

@SriramSakthivel, có một vấn đề ở đó, trong đó AFAIK C# không bao gồm một cơ chế để diễn tả các thuộc tính với ngữ nghĩa không đổi. IL bao gồm nhiều thứ hơn bất kỳ ngôn ngữ riêng lẻ nào. Vì vậy, không: Tôi không tin rằng nó có thể đưa ra một ví dụ, viết ngắn IL thô. –

+0

Tôi đoán là đúng, cảm ơn marc –

0

Tôi không biết bạn đang cố gắng làm gì. Dù sao, nếu bạn chỉ muốn lấy giá trị của một thuộc tính bằng cách sử dụng sự phản chiếu, bạn phải sử dụng GetValue. I E. một cái gì đó như thế này:

 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); 
    } 

Lưu ý rằng nếu bạn gọi GetConstantValue hoặc GetRawConstantValue trong ví dụ này bạn sẽ có được một InvalidOperationException, vì tài sản là không đổi.

Sự khác biệt giữa GetConstantValue và GetRawConstantValue đã được Marc giải thích một cách hoàn hảo.

Các vấn đề liên quan