可否在程序中动态修改自定义属性!?
自定义了一个属性
[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,请教各位大虾有没有解决办法
--------------------编程问答-------------------- 隐约觉得不能 --------------------编程问答-------------------- 你重新创建 DataFieldAttribute,当然是初始的了 --------------------编程问答-------------------- 函式使用缺省參數應該就可以,C#要在4.5之後的版本好像才有提供缺省。 --------------------编程问答--------------------
没有重新创建,实例生成后,更新自定义特性后,再读取就恢复初始,不信你自己试试 --------------------编程问答--------------------
麻烦能不能详细讲解一下 --------------------编程问答-------------------- 缺省參數延自C++,簡單的講就是在你的函式中給定初始值(詳細說明可以去看看C++相關的書籍或自己GOOGLE),當你調用函式時,引數不給值就是以初始值代入,給值就將其值代入函式。 --------------------编程问答-------------------- --------------------编程问答-------------------- 还是不太明白,能否就我的例子给一个解决方法 --------------------编程问答-------------------- up,大虾们都来帮帮忙啊 --------------------编程问答-------------------- C# 上应该没有这种方式的, --------------------编程问答--------------------
那有什么办法处理 --------------------编程问答-------------------- 求高手指点 --------------------编程问答-------------------- 机制问题,回避它把,可以在ClsPerson创建时,将属性的Attribute都缓存起来把(可以为实体建立基类,由基类来搞),以下代码供参考
基类中声明
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];
}
--------------------编程问答-------------------- 没有更好的办法么,总觉得这样做比较怪异 --------------------编程问答-------------------- DataFieldAttribute 类有个属性isConditionKey
请问你的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;
}
}
我的意思是我可以实例化的时候更改IsConditionKey --------------------编程问答-------------------- 继续关注中…… --------------------编程问答-------------------- 1.特性原本设计出来就是在设计/编译期决定滴,所以他本身应该是静态
2.因为某些人的特殊要求需要在运行期去决定,你需要是使用动态代理技术,大多数动态代理类都是emit实现,而emit的确可以去临时给对象创建Attribute
参考:http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html --------------------编程问答-------------------- 额,回复完了才发现是个坟贴
lz啊一年了,你居然还木搞定??
补充:.NET技术 , C#