Ani*_*pta 3 c# properties data-structures
[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;
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,您可以看到我创建了一个具有 ColumnName 属性的类注释。ColumnName 是我用来定义属性的自定义类。
现在我正在寻找一种解决方案来查找所有属性的 ColumnName 值。
public static List<T> ExecuteReader<T>(string str)
{
var res = typeof(T);
return new List<T>();
}
Run Code Online (Sandbox Code Playgroud)
我尝试在我的问题上运行一些 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;
}
}
Run Code Online (Sandbox Code Playgroud)
(按照约定,属性的名称应以 结尾Attribute,请注意,我已将 限制AttributeTargets为Propertyes 和Fields)您可以
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;
}
}
Run Code Online (Sandbox Code Playgroud)
ColumnNameAttribute(注意技巧:我们通过使用通用静态类来缓存列名称列表(以及具有 的字段/属性) 。.NET 运行时将创建各种不同的ColumnsCache<T1>, ColumnsCache<T2>, ColumnsCache<T3>,每个都有不同的列字典)
然后你可以
var cols = ColumnsCache<Comment>.Columns;
var colNames = cols.Values;
Run Code Online (Sandbox Code Playgroud)
该cols变量将引用字典MemberInfo-> string(列名),而colNames是IEnumerable<string>仅包含列名的变量。如果您想将反射与 a 结合使用,MemberInfo则必须检查 aMemberInfo是 aFieldInfo还是 a PropertyInfo,将其强制转换并使用FieldInfoor PropertyInfo。
| 归档时间: |
|
| 查看次数: |
15386 次 |
| 最近记录: |