non sono sicuro se è possibile che ho visto:
Change Attribute's parameter at runtime.
Il mio caso è molto simile, ma sto cercando di modificare l'attributo di una classe in runtime:Modifica classe di attributi sul runtime
[Category("Change me")]
public class Classic
{
public string Name { get; set; }
}
una delle risposte è stato:
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")
cambiato in formato più leggibile, grazie a Marc Gravell:
TypeDescriptor.AddAttributes(table, new Category{ Name = "Changed" });
Tutto è buono quando si usano TypeDescriptor ma quando si utilizza:
var attrs = (Category[])typeof(Classic).GetCustomAttributes(
typeof(Category),
true);
attrs[0].Name
nome ha il testo "mi Cambia".
C'è un modo per modificare questo attributo in fase di esecuzione?
Edit:
Ho bisogno di questo per Linq2Sql nella finestra di progettazione del codice generato è lo schema di DB. Voglio utilizzare lo schema predefinito dell'utente senza utilizzare il mapping XML o modificare il codice generato (la tabella è ancora in fase di sviluppo e cambia frequentemente).
Il codice designer è:
[global::System.Data.Linq.Mapping.TableAttribute(Name="DbSchema.MyTable")]
public partial class MyTable
Voglio l'attributo di essere:
[TableAttribute(Name="MyTable")]
Ora ho scavato nel codice Framework e penso linq2sql utilizza:
TableAttribute[] attrs = (TableAttribute[])typeof(MyTable)
.GetCustomAttributes(typeof(TableAttribute), true);
Quando uso TypeDescriptor per modificare l'attributo, il valore non viene modificato in GetCustomAttributes.
Perché vuoi fare questo? Gli attributi hanno lo scopo di fornire metadati, non molto altro. Perché non prendere l'approccio di avere una "lista delle regole" che è inizialmente popolata dagli attributi e cambiata da lì? – vcsjones
Cosa stai cercando di ottenere? Localizzare il testo nella categoria? –
@vcsjones ci crediate o no, ci sono momenti in cui è necessario aggiungere, modificare o eliminare gli attributi in fase di esecuzione. Ho dovuto farlo per aggiungere un convertitore ai binding WPF in modo che fossero serializzati invece di essere valutati. – Will