自定义了一个属性[AttributeUsage(AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field)]
public class DataFieldAttribute : Attribute
{
private string _fieldName; //字段名
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
} private bool _isConditionKey; //是否删除条件
public bool IsConditionKey
{
get { return _isConditionKey; }
set { _isConditionKey = value; }
} public DataFieldAttribute(string fieldName)
{
this._fieldName = fieldName;
}
}public class ClsPerson
{
private int _sysNo;
[DataField("SysNo")]
public int SysNo
{
get { return _sysNo; }
set { _sysNo = value; }
} private string _pName;
[DataField("PName")]
public string PName
{
get { return _pName; }
set { _pName = value; }
}
}
现在希望动态修改一个ClsPerson实例PName属性的自定义特性_isConditionKey为true但是发现修改完成后,读取ClsPerson实例时,GetCustomAttributes方法读取PName的_isConditionKey特性,.net都重新创建PName属性的DataFieldAttribute类,_isConditionKey又被重置成原来的值false,请教各位大虾有没有解决办法
public class DataFieldAttribute : Attribute
{
private string _fieldName; //字段名
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
} private bool _isConditionKey; //是否删除条件
public bool IsConditionKey
{
get { return _isConditionKey; }
set { _isConditionKey = value; }
} public DataFieldAttribute(string fieldName)
{
this._fieldName = fieldName;
}
}public class ClsPerson
{
private int _sysNo;
[DataField("SysNo")]
public int SysNo
{
get { return _sysNo; }
set { _sysNo = value; }
} private string _pName;
[DataField("PName")]
public string PName
{
get { return _pName; }
set { _pName = value; }
}
}
现在希望动态修改一个ClsPerson实例PName属性的自定义特性_isConditionKey为true但是发现修改完成后,读取ClsPerson实例时,GetCustomAttributes方法读取PName的_isConditionKey特性,.net都重新创建PName属性的DataFieldAttribute类,_isConditionKey又被重置成原来的值false,请教各位大虾有没有解决办法
基类中声明
private Hashtable m_attrs = new Hashtable();
基类构造中加入
Type t = this.GetType();
PropertyInfo [] props = t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);for (int i = 0; i < props.Length; i++)
{
attr = Attribute.GetCustomAttribute(props[i], typeof(DataFieldAttribute));
m_attrs[props[i].Name] = attr;
}
基类中提供自定义属性访问方法,要使用属性的自定义Attribute,就用他把
public DataFieldAttribute GetCacheAttribute(string propName)
{
return (DataFieldAttribute)m_attrs[propName];
}
请问你的isConditionKey是怎么初始化的
如果:bool isConditionKey;这个默认就是false如果你想改变的话
建议:[AttributeUsage(AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field)]
public class DataFieldAttribute : Attribute
{
private string _fieldName; //字段名
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
} private bool _isConditionKey; //是否删除条件,未赋值,默认就是false的
public bool IsConditionKey
{
get { return _isConditionKey; }
set { _isConditionKey = value; }
} public DataFieldAttribute(string fieldName,bool isConditionKey)
{
this._fieldName = fieldName;
this._isConditionKey=isConditionKey;
}
public DataFieldAttribute(string fieldName)
{
this._fieldName = fieldName;
} }
2.因为某些人的特殊要求需要在运行期去决定,你需要是使用动态代理技术,大多数动态代理类都是emit实现,而emit的确可以去临时给对象创建Attribute参考:http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html