C# 使用属性名称的字符串表示形式访问类属性和方法
我有一个类,它有一堆集合C# 使用属性名称的字符串表示形式访问类属性和方法,c#,C#,我有一个类,它有一堆集合 Class MyInfoClass { Queue<float> firstQ = new Queue<float>(); Queue<float> secondQ = new Queue<float>(); Queue<float> thirdQ = new Queue<float>(); Queue<float> fourthQ = new Queue<float>()
Class MyInfoClass
{
Queue<float> firstQ = new Queue<float>();
Queue<float> secondQ = new Queue<float>();
Queue<float> thirdQ = new Queue<float>();
Queue<float> fourthQ = new Queue<float>();
Queue<float> fifthQ = new Queue<float>();
}
class myParamClass
{
internal static string[] Chain =
{
"firstQ",
"secondQ",
"thirdQ",
"fourthQ",
"fifthQ"
}
}
我想使用字符串表示访问集合
class Program
{
static void Main(string[] args)
{
MyInfoClass myInfoChain = new MyInfoClass();
float i = 0;
//attempt to set
foreach (string qName in MyParamClass.Chain)
{
i++;
myInfoChain.GetType().GetProperty(qName).SetValue(myInfoChain,i);
}
//attempt to get
foreach (string qName in MyParamClass.Chain)
{
Trace.WriteLine(myInfoChain.GetType().GetProperty(qName).GetValue(myInfoChain,null));
}
}
}
我试图使用反射,但不断得到空对象异常,但并不真正关心如何实现这一点。我尝试过使用枚举,但过于复杂,我尝试过将字段作为属性公开并调用get set方法。我像一只仓鼠一样转啊转
具体来说,我需要知道如何访问如上所述的集合,但一般来说,如何使用属性/字段/方法名称字符串访问类的成员属性/字段/方法将非常有用
我读到的东西总是指向这样的东西
var letMeIn=MyInfoClass.GetProperty_firstQ.GetValuemyInfoChain的类型,null
但是无论我做什么,GetProperty_firstQ都是空的
感谢您的帮助。
决议如下:
关于将队列作为属性公开并使用
这是一个很好的解决方案
在递归循环中利用LINQ是我的核心目标,如下所示
我仍然觉得我应该在这里的某个地方使用枚举,但是这个谜题
现在问题已经解决了。非常感谢大家
你没有属性,你有字段。因此,您需要改为使用GetField方法。此外,字段是私有的,您需要指定BindingFlags.NonPublic标志:
你没有属性,你有字段。因此,您需要改为使用GetField方法。此外,字段是私有的,您需要指定BindingFlags.NonPublic标志: 但是无论我做什么,GetProperty_firstQ都是空的 那是因为你没有财产。添加一个。。。除了你的领域
public Queue<float> _firstQ { get { return firstQ; } }
上面的代码示例应该可以工作
但是请注意,在C中,属性通常以大写字母开头,所以
public Queue<float> FirstQ { get { return firstQ; } }
会更地道一些
事实上,如果您只需要动态访问第n个队列,则根本不需要反射:
public Queue<float>[] MyQueues
{
get
{
return new[] { firstQ, secondQ, thirdQ, fourthQ, fifthQ };
}
}
您只需访问第n个队列作为myInfoChain.MyQueues[n]。。。不需要思考
但是无论我做什么,GetProperty_firstQ都是空的
那是因为你没有财产。添加一个。。。除了你的领域
public Queue<float> _firstQ { get { return firstQ; } }
上面的代码示例应该可以工作
但是请注意,在C中,属性通常以大写字母开头,所以
public Queue<float> FirstQ { get { return firstQ; } }
会更地道一些
事实上,如果您只需要动态访问第n个队列,则根本不需要反射:
public Queue<float>[] MyQueues
{
get
{
return new[] { firstQ, secondQ, thirdQ, fourthQ, fifthQ };
}
}
您只需访问第n个队列作为myInfoChain.MyQueues[n]。。。无需反射。目前,队列是字段,而不是属性。尝试将它们定义为
FirstQ { get; set; }
并在构造函数中分配队列。那么GetPropertyFirstQ应该可以满足您的需要。目前,您的队列是字段,而不是属性。尝试将它们定义为
FirstQ { get; set; }
并在构造函数中分配队列。那么GetPropertyFirstQ应该可以满足您的需要。谢谢,正是我需要的,Occams razor:谢谢,正是我需要的,Occams razor:我发现它很难使用;幸运的是,我实际上不需要使用反射,这是我所怀疑的。但是谢谢你:我发现它很难使用;幸运的是,我实际上不需要使用反射,这是我所怀疑的。但谢谢你:请不要在问题中添加决议。如果你找到了一个很好的解决方案,你想为其他可能阅读你的问题的人发布,请将其作为另一个答案发布。你可以发布自己问题的答案。请不要在问题中添加决议。如果你找到了一个很好的解决方案,你想为其他可能阅读你的问题的人发布,请将其作为另一个答案发布。你可以对自己的问题给出答案。
public Queue<float>[] MyQueues
{
get
{
return new[] { firstQ, secondQ, thirdQ, fourthQ, fifthQ };
}
}
FirstQ { get; set; }