C# 如何通过名称访问类的属性?

C# 如何通过名称访问类的属性?,c#,enums,C#,Enums,我发现用一句话的标题很难清楚地描述这个案件。以下是一个例子: public class Person { public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } } public enum PersonProperties { FirstName = 1, MiddleName = 2

我发现用一句话的标题很难清楚地描述这个案件。以下是一个例子:

public class Person
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}

public enum PersonProperties
{
    FirstName = 1,
    MiddleName = 2,
    LastName = 3
}
我希望这样做:

foreach (var p in Persons) {
var nameCollection=new List<string>();
foreach (var s in (SectionsEnum[]) Enum.GetValues(typeof (SectionsEnum)))
{
    nameCollection.Add(p.GetPropertyByName(s);
}
}
foreach(个人var p){
var nameCollection=新列表();
foreach(在(SectionsEnum[]中的变量s)Enum.GetValues(typeof(SectionsEnum)))
{
添加(p.GetPropertyByName);
}
}

现在,我们如何实现
GetPropertyByName()
部分?

这应该是一个很好的起点

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person() { FirstName ="a", MiddleName = "b", LastName = "c" };

            List<string> result = new List<string>();

            string[] enums = Enum.GetNames(typeof(PersonProperties));

            foreach(string e in enums)
            {
                result.Add(p.GetType().GetProperty(e).GetValue(p, null).ToString());
            }

            int i = 0;
            foreach (string e in enums)
            {
                Console.WriteLine(string.Format("{0} : {1}", e, result[i++]));
            }

            Console.ReadKey(false);
        }
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
    }

    public enum PersonProperties
    {
        FirstName = 1,
        MiddleName = 2,
        LastName = 3
    }
}
使用系统;
使用System.Collections.Generic;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
Person p=newperson(){FirstName=“a”,MiddleName=“b”,LastName=“c”};
列表结果=新列表();
字符串[]enums=Enum.GetNames(typeof(PersonProperties));
foreach(枚举中的字符串e)
{
Add(p.GetType().GetProperty(e).GetValue(p,null.ToString());
}
int i=0;
foreach(枚举中的字符串e)
{
WriteLine(string.Format(“{0}:{1}”,e,result[i++]);
}
Console.ReadKey(false);
}
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串MiddleName{get;set;}
公共字符串LastName{get;set;}
}
公共枚举PersonProperties
{
FirstName=1,
MiddleName=2,
LastName=3
}
}

您可以使用反射直接执行此操作:

public string GetPropertyByName(SectionsEnum s)
{
    var property = typeof(Person).GetProperty(s.ToString());
    return (string)property.GetValue(this);
}
或者使用
开关

public string GetPropertyByName(SectionsEnum s)
{
    switch (s)
    {
        case SectionsEnum.FirstName:
            return this.FirstName;
        case SectionsEnum.MiddleName:
            return this.MiddleName;
        case SectionsEnum.LastName:
            return this.LastName;
        default:
            throw new Exception();
    }
}
但我想问的是,如果采用完全不同的方法,例如列出:

public IList<string> NameProperties
{
    get
    {
        return new[] { FirstName, MiddleName, LastName };
    }
}

从技术上讲你可以做到,但首先为什么?你想解决的问题是什么?你到底想做什么?你想在这里完成什么?如果你想通过属性的实际名称来获取对象的属性,反射可能会帮助你。我的类有二十多个属性,我想检索循环中的值而不是逐个访问它们。为什么不使用一个get-only属性来返回由所有内部属性组成的字典?
//was
SectionsEnum s = SectionsEnum.FirstName;
//instead
Func<Person, string> nameFunc = p => p.FirstName;
string name = nameFunc(myPerson);