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; }