如何在C#中为类属性获取属性值

如何在C#中为类属性获取属性值,c#,data-structures,properties,C#,Data Structures,Properties,在这段代码中,您可以看到我创建了一个具有属性ColumnName的类注释。ColumnName是我的自定义类,我用它来定义Attirbte 现在,我正在寻找一个解决方案来查找所有属性的ColumnName值 [System.AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] sealed class ColumnName : Attribute { // S

在这段代码中,您可以看到我创建了一个具有属性ColumnName的类注释。ColumnName是我的自定义类,我用它来定义Attirbte

现在,我正在寻找一个解决方案来查找所有属性的ColumnName值

 [System.AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
    sealed class ColumnName : Attribute
    {
        // See the attribute guidelines at 
        //  http://go.microsoft.com/fwlink/?LinkId=85236

        readonly string Column;

        // This is a positional argument
        public ColumnName(string columnName)
        {
            this.Column = columnName;
        }
    }

    public class Comment
    {
        [ColumnName("ID1")]
        public int Id;
        [ColumnName("NAME1")]
        public string Name;
        [ColumnName("TEST1")]
        public string Test;
    }
公共静态列表ExecuteReader(字符串str)
{
var res=类型(T);
返回新列表();
}
我试着在我的问题上运行一些堆栈溢出代码,但效果不好。代码中缺少什么内容?

给定

public static List<T> ExecuteReader<T>(string str)
        {
            var res = typeof(T);

            return new List<T>();
        }
(按照惯例,属性的名称应以
属性
结尾,请注意,我已将
属性属性
限制为
属性和
字段
s),您可以

cols
变量将引用一个dictionary
MemberInfo
->
string
(列名称),而
colNames
是一个只包含列名的
IEnumerable
。如果要将反射与
MemberInfo
一起使用,必须检查
MemberInfo
FieldInfo
还是
PropertyInfo
,将其强制转换并使用给定的
FieldInfo
PropertyInfo

public static List<T> ExecuteReader<T>(string str)
        {
            var res = typeof(T);

            return new List<T>();
        }
(按照惯例,属性的名称应以
属性
结尾,请注意,我已将
属性属性
限制为
属性和
字段
s),您可以


cols
变量将引用一个dictionary
MemberInfo
->
string
(列名称),而
colNames
是一个只包含列名的
IEnumerable
。如果要将反射与
MemberInfo
一起使用,则必须检查
MemberInfo
是否为
FieldInfo
PropertyInfo
,将其强制转换并使用
FieldInfo
PropertyInfo

您尝试了哪种代码?可能是@Fabiano的重复我再次尝试了那种类型的(T).GetProperties()返回null在示例中,您没有属性,只有成员变量。将它们转换为属性或使用typeof(T).GetMembers()或
typeof(T).GetFields()
(它们是字段)
GetMembers()
将同时返回字段、属性、方法、事件……您尝试了哪种代码?可能是@Fabiano的重复项我再次尝试了该类型的(T)。GetProperties()返回null在您的示例中,您没有属性,只有成员变量。将它们转换为属性或使用typeof(T).GetMembers()或
typeof(T).GetFields()
(它们是字段)
GetMembers()
将返回两个字段、属性、方法、事件。。。
public static class ColumnsCache<T>
{
    public static readonly IReadOnlyDictionary<MemberInfo, string> Columns = BuildColumnsDictionary();

    public static Dictionary<MemberInfo, string> BuildColumnsDictionary()
    {
        var dict = new Dictionary<MemberInfo, string>();

        var members = typeof(T).GetMembers(BindingFlags.Public | BindingFlags.Instance)
            .Where(x => x.MemberType == MemberTypes.Field || x.MemberType == MemberTypes.Property);

        foreach (MemberInfo member in members)
        {
            var attr = member.GetCustomAttribute<ColumnNameAttribute>(true);

            if (attr != null)
            {
                dict.Add(member, attr.Column);
            }
        }

        return dict;
    }
}
var cols = ColumnsCache<Comment>.Columns;
var colNames = cols.Values;