2014-10-31 60 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 
相关问题