当前位置:编程学习 > C#/ASP.NET >>

可否在程序中动态修改自定义属性!?

自定义了一个属性

[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之後的版本好像才有提供缺省。 --------------------编程问答--------------------
引用 2 楼  的回复:
你重新创建 DataFieldAttribute,当然是初始的了

没有重新创建,实例生成后,更新自定义特性后,再读取就恢复初始,不信你自己试试 --------------------编程问答--------------------
引用 3 楼  的回复:
函式使用缺省參數應該就可以,C#要在4.5之後的版本好像才有提供缺省。

麻烦能不能详细讲解一下 --------------------编程问答-------------------- 缺省參數延自C++,簡單的講就是在你的函式中給定初始值(詳細說明可以去看看C++相關的書籍或自己GOOGLE),當你調用函式時,引數不給值就是以初始值代入,給值就將其值代入函式。 --------------------编程问答-------------------- --------------------编程问答-------------------- 还是不太明白,能否就我的例子给一个解决方法 --------------------编程问答-------------------- up,大虾们都来帮帮忙啊 --------------------编程问答-------------------- C# 上应该没有这种方式的, --------------------编程问答--------------------
引用 10 楼  的回复:
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;
        }

    }




--------------------编程问答--------------------
引用 15 楼  的回复:
DataFieldAttribute 类有个属性isConditionKey
请问你的isConditionKey是怎么初始化的
如果:bool isConditionKey;这个默认就是false

如果你想改变的话
建议:


C# code


[AttributeUsage(AttributeTargets.Struct | AttributeTargets.Prop……

我的意思是我可以实例化的时候更改IsConditionKey --------------------编程问答-------------------- 继续关注中…… --------------------编程问答-------------------- 1.特性原本设计出来就是在设计/编译期决定滴,所以他本身应该是静态
2.因为某些人的特殊要求需要在运行期去决定,你需要是使用动态代理技术,大多数动态代理类都是emit实现,而emit的确可以去临时给对象创建Attribute

参考:http://www.cnblogs.com/yjmyzz/archive/2011/11/13/2247600.html --------------------编程问答-------------------- 额,回复完了才发现是个坟贴

lz啊一年了,你居然还木搞定??
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,