作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
[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
的反射,你必须检查 MemberInfo
是 FieldInfo
还是 PropertyInfo
,转换它并使用 FieldInfo
或 PropertyInfo
。
关于c# - 如何在 C# 中获取类属性的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429382/
我是一名优秀的程序员,十分优秀!