Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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#中类内的s值?_C#_Reflection - Fatal编程技术网

如何动态设置变量';C#中类内的s值?

如何动态设置变量';C#中类内的s值?,c#,reflection,C#,Reflection,我正在尝试这样做: public class MyClass() { private void SetAValiable(int boolNumber) { bool b1 = false; bool b2 = false; ("b" + boolNumber) = true; } } public T Reflect<T, X> (X Value, int i) { var Fields = typeOf(T).GetFields()

我正在尝试这样做:

public class MyClass()
{
  private void SetAValiable(int boolNumber)
  {
    bool b1 = false;
    bool b2 = false;

    ("b" + boolNumber) = true;
  }
}
public T Reflect<T, X> (X Value, int i) { 
   var Fields = typeOf(T).GetFields();
   var obj = Activator.CreateInstance<T>(); // let's say you cant create the object the normal way
   Fields[i].setValue(obj, Value);
// then you can cast obj to your type and return it or do whatever you wanna do with it
   return (T) obj;
}
public class MyClass()
{
     private bool b1;
     private bool b2;
}
我已尝试过此操作,但始终从GetProperty调用中获取空值:

Type myType = typeof(MyClass);
PropertyInfo pinfo = myType.GetProperty("b" + boolNumber);
pinfo.SetValue(myType, true, null);
有人有没有想过如何让它发挥作用


谢谢

使用数组,而不是反射:

public class MyClass()
{
    private void SetAValiable(int boolNumber)
    {
        bool[] b = new bool[2]; //will default to false values
        b[boolNumber] = true;
    }
}

不可能像您尝试的那样使用反射来访问局部变量。它们必须是字段才能成为一个选项,但即使这样,它仍然不是正确的选项。

如果您对所描述的方式感兴趣,那么您有两个选项,第一个是您可以使用静态字段,但是如果您不能使用静态字段,反射的工作方式如下:

public class MyClass()
{
  private void SetAValiable(int boolNumber)
  {
    bool b1 = false;
    bool b2 = false;

    ("b" + boolNumber) = true;
  }
}
public T Reflect<T, X> (X Value, int i) { 
   var Fields = typeOf(T).GetFields();
   var obj = Activator.CreateInstance<T>(); // let's say you cant create the object the normal way
   Fields[i].setValue(obj, Value);
// then you can cast obj to your type and return it or do whatever you wanna do with it
   return (T) obj;
}
public class MyClass()
{
     private bool b1;
     private bool b2;
}
公共T反射(X值,int i){ var Fields=typeOf(T).GetFields(); var obj=Activator.CreateInstance();//假设您无法以正常方式创建对象 字段[i]。设置值(obj,值); //然后,您可以将obj转换为您的类型并返回它,或者对它执行任何您想执行的操作 返回(T)obj; }
首先
b1
b2
不是
MyClass
的成员。这就是为什么您会得到
null
。 你需要这样的东西:

public class MyClass()
{
  private void SetAValiable(int boolNumber)
  {
    bool b1 = false;
    bool b2 = false;

    ("b" + boolNumber) = true;
  }
}
public T Reflect<T, X> (X Value, int i) { 
   var Fields = typeOf(T).GetFields();
   var obj = Activator.CreateInstance<T>(); // let's say you cant create the object the normal way
   Fields[i].setValue(obj, Value);
// then you can cast obj to your type and return it or do whatever you wanna do with it
   return (T) obj;
}
public class MyClass()
{
     private bool b1;
     private bool b2;
}

其次,
setValue
的第一个参数需要是类
MyClass
的实例。在您的示例中,它是
类型的一个实例

“变量”和“可用”是两个截然不同的东西。“a valiable”两者都不是。b1和b2不是MyClass的属性,而是SetAvailable中的变量。OP根本没有任何字段。他有当地人。如果他有字段,他可以使用反射,当然。字段不需要是静态的,他也不需要使用反射来创建字段。因为代码是在实例方法中运行的,所以他已经有了一个实例。这是
这个
。当然还有一个事实,他首先不应该使用反射来做这件事。他应该使用数组。@Servy:你说得对,我在读了你的答案后发布了这个,但我之所以这么做是因为我认为这个用户可能对学习反思感兴趣,所以尽管你的答案是最好的,如果他想学习如何使用反射,那么他需要尝试解决应该使用反射来解决的问题。这就是您学习如何正确使用给定工具的方式。当然,你的答案有一大堆问题,包括没有正确地使用反射来解决问题,而且你一开始就建议使用反射。@Servy:我没有建议,我说的是如果他对他目前正在做的事情感兴趣(我不一定推荐),然后,他可以通过这种方式使用反射将值分配给另一个类的字段。所以我写了一个一般性的答案,只是展示了在这种情况下反射是如何工作的。因此,如果您假设该用户对C#一无所知,并且他不会意识到需要首先从该方法中获取布尔类型,那么我认为这个问题必须解决,因为对该问题的理解非常有限。您建议使用静态字段,这似乎根本不合适,您建议使用反射创建该类型的新实例,这是不合适的,您甚至没有提供可编译的代码,因为您错误地拼写了运算符和方法。如果你的目标是解释如何使用反射,那么你没有做到。