Roy*_*lal 8 c# reflection attributes .net-3.5 linq-to-sql
我不确定我是否有可能看到:
在运行时更改属性的参数.
我的情况非常相似,但我试图在运行时更改类的属性:
[Category("Change me")]
public class Classic
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
其中一个答案是:
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")
Run Code Online (Sandbox Code Playgroud)
更改为更易阅读的格式,感谢Marc Gravell:
TypeDescriptor.AddAttributes(table, new Category{ Name = "Changed" });
Run Code Online (Sandbox Code Playgroud)
使用TypeDescriptor但使用时,一切都很好:
var attrs = (Category[])typeof(Classic).GetCustomAttributes(
typeof(Category),
true);
attrs[0].Name
Run Code Online (Sandbox Code Playgroud)
名称包含"更改我"文本.
有没有办法在运行时更改此属性?
编辑:
我在设计器中为Linq2Sql需要这个,生成的代码具有DB模式.我想使用用户的默认架构而不使用XML映射或更改生成的代码(表仍处于开发阶段并经常更改).
设计师代码是:
[global::System.Data.Linq.Mapping.TableAttribute(Name="DbSchema.MyTable")]
public partial class MyTable
Run Code Online (Sandbox Code Playgroud)
我希望该属性为:
[TableAttribute(Name="MyTable")]
Run Code Online (Sandbox Code Playgroud)
现在我已经挖掘了框架代码,我认为linq2sql使用:
TableAttribute[] attrs = (TableAttribute[])typeof(MyTable)
.GetCustomAttributes(typeof(TableAttribute), true);
Run Code Online (Sandbox Code Playgroud)
当我使用TypeDescriptor更改属性时,GetCustomAttributes中的值不会更改.
如果您使用反射,则不太像这样 -反射属性无法被替换 - 只有组件模型视图受到TypeDescriptor. 但是,您可以CategoryAttribute根据您的目的进行子类化。对于 i18n 特别有用。
using System.ComponentModel;
using System;
[MyCategory("Fred")]
class Foo { }
static class Program
{
static void Main()
{
var ca = (CategoryAttribute)Attribute.GetCustomAttribute(typeof(Foo), typeof(CategoryAttribute));
Console.WriteLine(ca.Category);
// ^^^ writes "I was Fred, but not I'm EVIL Fred"
}
}
class MyCategoryAttribute : CategoryAttribute
{
public MyCategoryAttribute(string category) : base(category) { }
protected override string GetLocalizedString(string value)
{
return "I was " + value + ", but not I'm EVIL " + value;
}
}
Run Code Online (Sandbox Code Playgroud)