簡體   English   中英

C#:使用反射獲取構造函數中實例成員的引用

[英]C#: use reflection to obtain reference to instance's member in constructor

上一堂課

public class MyClass
{
    public SomeObject myObject;
    public AnotherObject myOtherObject;
    // many more members

    public MyClass()
    {
        string name = getMemberNameAndValue();
        // name == "myObject" or "myOtherObject"

        // now obtain reference to _this_ instance's
        // member given by `name` so I can set its member's value.
    }
}

我不只是想獲得一個與name給定類型相同的新對象,我想獲得對所創建實例成員的實際引用,以便可以設置其自身的成員值。

編輯:我更改了get函數的名稱。 也就是說,此(服務器調用)函數不僅檢索要設置的成員的名稱,而且還檢索將其設置為的值。 要設置哪個成員(即myObjectmyOtherObject )不是固定的,並且可能根本不會設置一個。

EDIT2:我打算使用反射的原因是成員對象的列表將很大,我想避免使用許多if語句甚至長switch (如以下注釋中所建議)。

基於FieldInfo.SetValueMSDN )的MSDN條目:

獲取適當的FieldInfo對象:

 FieldInfo myFieldInfo = myType.GetField(name, 
            BindingFlags.NonPublic | BindingFlags.Instance); 

設置值:

myFieldInfo.SetValue(this, new SomeObject()); 

與所有反射一樣,它不是非常有效; 並且在很多地方您可以分配不正確的類型等,因此在執行此操作時要小心。 如果沒有看到更多代碼,您實際上不太可能在這里使用反射。

FieldInfo fi = this.GetType().GetField(name, BindingFlags.Public | BindingFlags.Instance); //reference

this.GetType().InvokeMember(name, BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, this, new object[]{value}); //plain setting

object value = this.GetType().InvokeMember(name, BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, this, null); //plain getting

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM