我不确定是否可以在运行时更改属性的参数?例如,在程序集内部,我有以下类
public class UserInfo { [Category("change me!")] public int Age { get; set; } [Category("change me!")] public string Name { get; set; } }
这是由第三方供应商提供的类,我无法更改代码.但是现在我发现上面的描述并不准确,并且当我将上述类的实例绑定到属性网格时,我想将"更改我"类别名称更改为其他名称.
我可以知道怎么做吗?
那么你每天都学到新的东西,显然我撒了谎:
通常没有意识到的是,您可以在运行时相当容易地更改属性实例值.当然,原因是创建的属性类的实例是完全正常的对象,可以不受限制地使用.例如,我们可以得到对象:
ASCII[] attrs1=(ASCII[]) typeof(MyClass).GetCustomAttributes(typeof(ASCII), false);...更改其公共变量的值并显示它已更改:
attrs1[0].MyData="A New String"; MessageBox.Show(attrs1[0].MyData);...最后创建另一个实例并显示其值未更改:
ASCII[] attrs3=(ASCII[]) typeof(MyClass).GetCustomAttributes(typeof(ASCII), false); MessageBox.Show(attrs3[0].MyData);
http://www.vsj.co.uk/articles/display.asp?id=713
如果其他人沿着这条大道走下去,答案就是你可以用反射来做,除非你不能,因为框架中有一个错误.这是你如何做到的:
Dim prop As PropertyDescriptor = TypeDescriptor.GetProperties(GetType(UserInfo))("Age") Dim att As CategoryAttribute = DirectCast(prop.Attributes(GetType(CategoryAttribute)), CategoryAttribute) Dim cat As FieldInfo = att.GetType.GetField("categoryValue", BindingFlags.NonPublic Or BindingFlags.Instance) cat.SetValue(att, "A better description")
一切都很好,除了为所有属性更改了category属性,而不仅仅是'Age'.