自定义了一个属性[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,请教各位大虾有没有解决办法

解决方案 »

  1.   

    你重新创建 DataFieldAttribute,当然是初始的了
      

  2.   

    缺省參數延自C++,簡單的講就是在你的函式中給定初始值(詳細說明可以去看看C++相關的書籍或自己GOOGLE),當你調用函式時,引數不給值就是以初始值代入,給值就將其值代入函式。
      

  3.   

    机制问题,回避它把,可以在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];
    }
      

  4.   

    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;
            }    }
      

  5.   

    我的意思是我可以实例化的时候更改IsConditionKey
      

  6.   

    1.特性原本设计出来就是在设计/编译期决定滴,所以他本身应该是静态
    2.因为某些人的特殊要求需要在运行期去决定,你需要是使用动态代理技术,大多数动态代理类都是emit实现,而emit的确可以去临时给对象创建Attribute参考:http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html