如何使用反射设置属性值

9

我有一个被属性修饰的类...

[DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]

由于某种需求,我想在运行时将这个值 MESSAGE_STAGING 更改为 Test_Message_Staging

有没有最好的方法来实现这一点?

我可以使用反射吗,或者还有其他方法可以做到这一点。

请提供代码示例。

谢谢 SNA


你试图解决的是什么根本问题? - Lasse V. Karlsen
3个回答

9

我不相信可以使用反射来设置属性 - 即使可以,我也鼓励您不要这样做。

属性应该用于在编译时已知的元数据。如果您想要更动态的元数据形式,请从文件中加载或使用app.config... 或者至少有一些特殊的“占位符”值(如连接字符串中的|DataDirectory|),可以在执行时解析。


要求是我必须以某种方式更改表名。属性不允许从web.config中获取值。参数应该是一个常量。所以我能想到的唯一主意是从反射中获取类的属性(dataEntity)并更改其属性。但这是否可能? - SNA

5

使用反射在运行时更改属性值是不可能的,因为属性是元数据序列化在程序集中的,更改它们意味着更改程序集。


反射是一种通用机制,因为它的基础是根Object类的GetType方法。它返回的类型信息不可扩展,即在目标类型编译后无法修改。 - Branislav Abadjimarinov

1
如果我理解你的意思正确的话,在反射中有可能以运行时改变实例的属性值的方法...可以查看示例代码。
        AttributeCollection ac  = TypeDescriptor.GetAttributes(yourObj);

        foreach (var att in ac)
        {
            //DataEntityAttribute  -- ur attribute class name
            DataEntityAttribute da = att as DataEntityAttribute ;
            Console.WriteLine(da.field1);  //initially it shows MESSAGE_STAGING
            da.field1= "Test_Message_Staging";  
         }


         //Check the changed value
        AttributeCollection acc = TypeDescriptor.GetAttributes(yourObj);

        foreach (var att in ac)
        {
            DataEntityAttribute da = att as DataEntityAttribute ;
            Console.WriteLine(da.field1); //now it shows Test_Message_Staging
        }

1
这不会持久化到实例化的对象。 - Ed DeGagne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接