gpt4 book ai didi

c# - 如何在 C# 中获取类属性的属性值

转载 作者:行者123 更新时间:2023-12-02 03:54:26 24 4
gpt4 key购买 nike

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

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

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

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

return new List<T>();
}

我尝试针对我的问题运行一些 Stack Overflow 代码,但效果不佳。我的代码中缺少什么?

最佳答案

给定

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public sealed class ColumnNameAttribute : Attribute
{
public readonly string Column;

public ColumnNameAttribute(string columnName)
{
this.Column = columnName;
}
}

(按照约定,属性的名称应以 Attribute 结尾,请注意我已将 AttributeTargets 限制为 Property es 和 Field s)你可以

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

(注意技巧:我们通过使用通用静态类来缓存列名列表(以及具有 ColumnNameAttribute 的字段/属性)。.NET 运行时将创建各种不同的 ColumnsCache<T1>ColumnsCache<T2>ColumnsCache<T3> ,每个一个具有不同的列字典)

那么你可以

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

cols 变量将引用字典 MemberInfo -> string(列名),而 colNames 是仅包含列名的 IEnumerable<string>。如果你想使用 MemberInfo 的反射,你必须检查 MemberInfoFieldInfo 还是 PropertyInfo ,转换它并使用 FieldInfoPropertyInfo

关于c# - 如何在 C# 中获取类属性的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com