2014-10-31 85 views
0

獲得參考實例的成員提供類C#:使用反射來在構造

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:我打算的原因(ED)使用反射的是,成員對象的列表會很大,我想避免使用許多if陳述或者甚至更長switch(如建議在下面的評論) 。

+2

到目前爲止,您試圖做些什麼來設置使用反射的字段,以及您嘗試解決方案時遇到了哪些問題? – Servy 2014-10-31 17:44:19

+2

我對你想要在這裏完成的事情感到困惑。爲什麼你需要爲此使用反射?爲什麼不能用實際的實例來設置它的值?只有當你不知道什麼是可能的時候,反思纔是必要的......但你在這裏確實知道。 – 2014-10-31 17:47:52

+0

'getObjectName'方法不僅返回'myObject' xor'myOtherObject'的值,還返回將要設置的值。這意味着,我需要獲得要設置的成員(在函數調用之後),然後進行設置。 – jayflo 2014-10-31 17:51:33

回答

2

基於關閉MSDN條目FieldInfo.SetValueMSDN)的:

獲取適當FieldInfo對象:

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

設定值:

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

如同所有的反射,其效率不高;並且有很多地方可能會分配不正確的類型等,所以在做這件事時要小心。沒有看到更多的代碼,你不太可能在實際上想要在這裏使用反射。

+0

我很困惑這個「這個」是指什麼,直到我意識到這是他的例子中的一個MyClass的實例。代碼爲我工作,描述出現在搜索。 – CharlesW 2016-09-14 22:11:52

0
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 
相關問題