Nie jestem pewien, czy to jest możliwe, widziałem:
Change Attribute's parameter at runtime.
Mój przypadek jest bardzo podobny, ale staram się zmienić atrybut klasy w Runtime:Modyfikowanie klasy atrybutu na Runtime
[Category("Change me")]
public class Classic
{
public string Name { get; set; }
}
Jedna z odpowiedzi brzmiała:
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")
Zmieniono do formatu bardziej czytelny, dzięki Marc Gravell:
TypeDescriptor.AddAttributes(table, new Category{ Name = "Changed" });
Wszystko jest dobrze, gdy za pomocą TypeDescriptor ale przy użyciu:
var attrs = (Category[])typeof(Classic).GetCustomAttributes(
typeof(Category),
true);
attrs[0].Name
Nazwa ma "Zmień mnie" tekst.
Czy istnieje sposób na zmianę tego atrybutu w środowisku wykonawczym?
Edit:
muszę to dla linq2sql w projektanta wygenerowany kod ma schematu DB. Chcę użyć domyślnego schematu użytkownika bez użycia mapowania XML lub zmienić wygenerowanego kodu (tabela jest wciąż w fazie rozwoju i często się zmienia).
Kod projektant:
[global::System.Data.Linq.Mapping.TableAttribute(Name="DbSchema.MyTable")]
public partial class MyTable
Chcę atrybut być:
[TableAttribute(Name="MyTable")]
Teraz mam wykopane w kodzie ramowego i myślę Linq2Sql używa:
TableAttribute[] attrs = (TableAttribute[])typeof(MyTable)
.GetCustomAttributes(typeof(TableAttribute), true);
Kiedy używam TypeDescriptor do zmiany atrybutu, wartość nie jest zmieniona w GetCustomAttributes.
Dlaczego chcesz to zrobić? Atrybuty mają dostarczać metadane, nie wiele więcej. Dlaczego nie przyjąć podejścia polegającego na posiadaniu "listy reguł", która jest początkowo zapełniana atrybutami i zmieniana? – vcsjones
Co próbujesz osiągnąć? Lokalizowanie tekstu w kategorii? –
@vcsjones wierzyć lub nie, są chwile, w których trzeba dodać, zmienić lub usunąć atrybuty w czasie wykonywania. Musiałem to zrobić, aby dodać konwerter do powiązań WPF, aby były serializowane, a nie oceniane. – Will