如何动态设置变量';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#一无所知,并且他不会意识到需要首先从该方法中获取布尔类型,那么我认为这个问题必须解决,因为对该问题的理解非常有限。您建议使用静态字段,这似乎根本不合适,您建议使用反射创建该类型的新实例,这是不合适的,您甚至没有提供可编译的代码,因为您错误地拼写了运算符和方法。如果你的目标是解释如何使用反射,那么你没有做到。