C#:使用反射获取对实例的引用';构造函数中的成员
上课C#:使用反射获取对实例的引用';构造函数中的成员,c#,reflection,C#,Reflection,上课 public class MyClass { public SomeObject myObject; public AnotherObject myOtherObject; // many more members public MyClass() { string name = getMemberNameAndValue(); // name == "myObject" or "myOtherObject"
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:我打算(ed)使用反射的原因是成员对象的列表会很大,我希望避免使用许多
if
语句,甚至避免使用长的开关(如下面的注释中所建议的)。基于FieldInfo.SetValue
()的MSDN条目:
获取相应的FieldInfo
对象:
FieldInfo myFieldInfo = myType.GetField(name,
BindingFlags.NonPublic | BindingFlags.Instance);
设置值:
myFieldInfo.SetValue(this, new SomeObject());
正如所有的思考一样,它不是很有效率;在很多地方,您可能会指定不正确的类型,等等。因此在执行此操作时要小心。如果没有看到更多的代码,您就不太可能真正想在这里使用反射。到目前为止,您在使用反射设置字段方面做了哪些尝试,以及您尝试的解决方案遇到了哪些问题?我对您试图在这里实现的目标感到相当困惑。为什么需要使用反射来进行此操作?为什么不能使用实际实例来设置其值?只有当你不知道事情可能是什么的时候,反思才是必要的。。但是您知道,这里,getObjectName
方法不仅返回myObject
xormyOtherObject
的值,还返回要设置的值。这意味着,我需要获得要设置的成员(在函数调用之后),然后设置它。@jayflo快速风格推荐;在构造函数中,这通常不是一个好主意。对我来说,这听起来是一个相当糟糕的设计;您将有条件地初始化这样的变量。不管在这里,一个简单的if
语句关闭bool
返回值似乎就足够了。事实上,许多对象的数量会更大,我认为一大串if
语句或一个switch
来有条件地设置这些成员对象的值会失控。我也很困惑“this”指的是什么,直到我意识到在他的示例中它是MyClass的一个实例。代码对我有用,搜索中出现了描述。
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