[英]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
函數的名稱。 也就是說,此(服務器調用)函數不僅檢索要設置的成員的名稱,而且還檢索將其設置為的值。 要設置哪個成員(即myObject
或myOtherObject
)不是固定的,並且可能根本不會設置一個。
EDIT2:我打算使用反射的原因是成員對象的列表將很大,我想避免使用許多if
語句甚至長switch
(如以下注釋中所建議)。
基於FieldInfo.SetValue
( MSDN )的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.