为反射提供参数元标记

本文关键字:参数 反射 | 更新日期: 2023-09-27 18:03:05

我想标记一个参数,这样我就可以通过反射读取标签。我想这样做的原因是因为我正在创建映射到数据库的业务层对象,并且我想将某些参数标记为"只读",例如在数据库中生成的uniqueidentifier字段。

我已经遍历属性以填充参数。这是我如何赋值的一个片段…

foreach (var prop in this.GetType().GetProperties())
{
   switch (prop.PropertyType.Name)
   {
      case "Int32":
          int tmpInt = -1;
          if (!DBNull.Value.Equals(rowFromDatabase[prop.Name]) && int.TryParse(rowFromDatabase[prop.Name].ToString(), out tmpInt))
          {
             prop.SetValue(sender, tmpInt);
          }
          break;
      case "Boolean":
          bool tmpBool = false;
          if (!DBNull.Value.Equals(rowFromDatabase[prop.Name]) && bool.TryParse(rowFromDatabase[prop.Name].ToString(), out tmpBool))
          {
             prop.SetValue(sender, tmpBool);
          }
          break;
          ..............
          continued...
          ..............
   }
}

我希望能够通过上面显示的prop变量访问参数上的某种元数据,我可以在其中指定一些额外的信息。我该怎么做呢?

编辑:我想这样设置元数据

[CustomTag]
public Guid ID { get; set; }

为反射提供参数元标记

扩展System.Attribute类,然后用自定义属性装饰您的属性。

例如:

public class ReadOnlyAttribute : System.Attribute
{
}

public class DbColumnInfoAttribute : System.Attribute
{
    public string ColumnName {get; set; }
    public bool Required { get; set; }
    public DbColumnInfoAttribute( string name, bool req){
       ColumnName = name;
       Required = req;
    }
}

然后使用它们:

public class YourClass
{
   [ReadOnly]
   [DbColumnInfo( "User_Name", true)]
   public string UserName { get; set; }
}

通过反射读取它们:

var listOfAttrib = prop.GetCustomAttributes(typeof(MyAttribute), true);

我建议你所有的属性类扩展一个共同的类,这样你就可以得到所有的自定义属性,而不必知道你正在寻找的确切属性,否则你最终将不得不触发多个GetCustomAttributes