2011-11-11 29 views

回答

1

您沒有訪問它沒有反映,但如果你 - 這是你如何做到這一點:

using System.Diagnostics; 
using System.Linq; 
using System.Reflection; 

class Program 
{ 
    internal class MyClass 
    { 
     public string MyProperty { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     foreach (var mi in 
       typeof(MyClass).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance) 
        .Where(m => m is FieldInfo)) 
     { 
      Debug.WriteLine(mi.Name); 
     } 

     MyClass o = new MyClass(); 
     var fi = (FieldInfo)typeof(MyClass).GetMember(
      "<MyProperty>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic)[0]; 
     fi.SetValue(o, "Success"); 
     Debug.WriteLine(o.MyProperty); 
    } 
} 

這給出了以下的輸出:

<MyProperty>k__BackingField 
Success 
1

該語法適用於auto-implemented property。 支持變量由編譯器生成,並且您無權訪問它。

這基本上是編譯成類似:

private string __foo_1; // Compiler-generated - cannot access. 
public string ModifiedBy 
{ 
    get { return __foo_1; } 
    set { __foo_1 = value; } 
} 
+1

你可以通過反射來訪問它 –

+1

@parapurarajkumar:理論上你可以,但對於大多數程序來說,沒有什麼好的結果。 – BrokenGlass

+0

當然。但是你爲什麼要這麼做呢,你可以自己添加支持變量,並避免反射的緩慢?我的推測是OP沒有完全理解C#中的屬性是如何工作的。 –

3

它存儲在被編譯器生成的私人支持字段。該字段的名稱類似<ModifiedBy>k__BackingField,雖然可以通過反射來找到它,但不一定是一個好主意。

如果您有訪問該字段的特定原因,則應該將該屬性更改爲使用具有定義的後臺字段的顯式實現。但是,由於根據定義,自動屬性除了保存和檢索該值之外什麼都不做,因此如果您尚未使用更復雜的getter和setter,則我認爲沒有理由需要訪問該字段。

+2

變量的實際名稱是_ModifiedBy。 – Ryan

+0

@minitech:該字段的實際名稱是' k__BackingField'。我更新了我的答案以反映這一點。感謝您指出。 – StriplingWarrior

+0

沒錯,但是你不能只是試着在某處使用_ModifiedBy,並期望它能夠工作。這就是我爲什麼離開它的原因。 –

7

是的,編譯器生成一個後臺字段。

不,你不能在編譯時訪問它。

是的,你可以在運行時通過反射來訪問它。

不,你不應該。


訪問屬性的支持字段,勿庸置疑,實現與支持字段屬性最簡單的方法:如果你想輕鬆自動實現的屬性的

private int _myInt; 
public int MyInt { 
    get { return _myInt; } 
    set { _myInt = value; } 
} 

,但不希望每個人都能夠改變它的價值,它可能是適當的訪問修飾符限制爲一個或它的其它部分,即

public int MyInt { get; private set; } // or protected set etc 
0

你不能。但問題是,爲什麼你會想要這樣做呢?如果是速度問題,則不需要使用屬性。否則,我真的沒有理由可以看到你需要訪問自動實現的屬性的支持變量,因爲它們沒有副作用,所以功能幾乎與普通字段相同。

1

理論上公共汽車財產就像一個公共變量。正如許多人已經提到的那樣;編譯器將創建所需的私有變量來保存數據。如果您需要訪問底層的專用變量,請輸入硬編碼的變量名稱以避免運行時異常。

在現實然而我們需要創建汽車財產確保未來的發展不會打破,在這個裝配depent應用。

將公共變量更改爲屬性是breaking change。參考鏈接的博客以更好地理解它。

相關問題