我不确定是否有可能,但我看到过以下内容:
在运行时更改属性参数
我的情况非常相似,但我正在尝试在运行时更改类的属性:
[Category("Change me")]
public class Classic
{
public string Name { get; set; }
}
其中一个答案是:
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")
由于Marc Gravell的帮助,已更改为更易读的格式:
TypeDescriptor.AddAttributes(table, new Category{ Name = "Changed" });
使用TypeDescriptor时一切都很好,但是当使用:
var attrs = (Category[])typeof(Classic).GetCustomAttributes(
typeof(Category),
true);
attrs[0].Name
名称显示“Change me”的文本。
有没有办法在运行时更改此属性?
编辑:
我需要在Linq2Sql中使用设计器生成的代码,该代码具有DB模式。我想使用用户的默认模式,而不使用XML映射或更改生成的代码(表仍处于开发阶段并经常更改)。
设计器代码如下:
[global::System.Data.Linq.Mapping.TableAttribute(Name="DbSchema.MyTable")]
public partial class MyTable
我希望属性是:
[TableAttribute(Name="MyTable")]
现在我已经深入研究了框架代码,我认为linq2sql使用的是:
TableAttribute[] attrs = (TableAttribute[])typeof(MyTable)
.GetCustomAttributes(typeof(TableAttribute), true);
当我使用TypeDescriptor改变属性时,在GetCustomAttributes中的值并没有改变。
TypeDescriptor
代码本身非常脆弱;一个不错的解决方案是使用TypeDescriptor.AddAttributes
和TypeDescriptor.GetAttributes
,而不是在属性实例上使用反射。 - Marc Gravell