Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:使用反射获取对实例的引用';构造函数中的成员_C#_Reflection - Fatal编程技术网

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
xor
myOtherObject
的值,还返回要设置的值。这意味着,我需要获得要设置的成员(在函数调用之后),然后设置它。@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