Quindi ho una classe PropertyBag che è pensata per implementare INotifyPropertyChanged. Per fare in modo che questo codice funzioni nel modo più pulito possibile e per evitare errori dell'utente, sto usando lo stack per ottenere il nome della proprietà. Vedi, se il nome della proprietà non corrisponde esattamente alla proprietà effettiva, allora avrai un fallimento e sto cercando di proteggerlo.Un modo per evitare l'ottimizzazione in linea della proprietà in C#?
Quindi, ecco un esempio di utilizzo della classe:
public class MyData : PropertyBag
{
public MyData()
{
Foo = -1;
}
public int Foo
{
get { return GetProperty<int>(); }
set { SetProperty(value); }
}
}
Il codice importante per la PropertyBag di base è qui:
public abstract class PropertyBag : INotifyPropertyChanged
{
protected T GetProperty<T>()
{
string propertyName = PropertyName((new StackTrace()).GetFrame(1));
if (propertyName == null)
throw new ArgumentException("GetProperty must be called from a property");
return GetValue<T>(propertyName);
}
protected void SetProperty<T>(T value)
{
string propertyName = PropertyName((new StackTrace()).GetFrame(1));
if (propertyName == null)
throw new ArgumentException("SetProperty must be called from a property");
SetValue(propertyName, value);
}
private static string PropertyName(StackFrame frame)
{
if (frame == null) return null;
if (!frame.GetMethod().Name.StartsWith("get_") &&
!frame.GetMethod().Name.StartsWith("set_"))
return null;
return frame.GetMethod().Name.Substring(4);
}
}
Quindi, ora che avete visto il mio codice, non posso dirvi il problema ... In alcuni casi in build di rilascio, il setter "Foo" nel costruttore "MyData" sembra essere ottimizzato per inline come SetProperty (-1). Sfortunatamente, questa ottimizzazione in linea fallisce il mio metodo SetProperty perché non lo chiamo più da una proprietà! FALLIRE. Sembra che non possa fare affidamento su StackTrace in questo modo.
Qualcuno può A: trovare un modo migliore per farlo ma evitare ancora di passare in "Foo" a GetProperty e SetProperty?
B: trovare un modo per dire al compilatore di non ottimizzare in questo caso?
Ho dimenticato di dire: non utilizzare un dizionario per la memorizzazione: poiché si tende ad avere un numero limitato di proprietà, la scansione di un elenco semplice è in realtà molto più rapida (lo spartiacque è di circa 120 chiavi). –
Puoi renderli virtuali ... – BrainSlugs83