Así que tengo una clase PropertyBag que está destinada a implementar INotifyPropertyChanged. Para hacer que este código funcione lo más limpiamente posible y para evitar el error del usuario, estoy usando la pila para obtener el nombre de la propiedad. Vea, si el nombre de la propiedad no concuerda exactamente con la propiedad real, entonces tendrá una falla y estoy tratando de protegerme de eso.¿Alguna forma de evitar la optimización en línea de propiedades en C#?
lo tanto, aquí es un ejemplo de uso de la clase:
public class MyData : PropertyBag
{
public MyData()
{
Foo = -1;
}
public int Foo
{
get { return GetProperty<int>(); }
set { SetProperty(value); }
}
}
El código importante para el PropertyBag base está aquí:
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);
}
}
Así que ahora que usted ha visto mi código, que pueda le dirá el problema ... En algunos casos, en la compilación de lanzamiento, el colocador "Foo" en el constructor "MyData" parece estar optimizado para alinearse como SetProperty (-1). Desafortunadamente, esta optimización en línea falla en mi método SetProperty porque ya no lo llamo desde una propiedad. FALLAR. Parece que no puedo confiar en StackTrace de esta manera.
¿Alguien puede A: averiguar una mejor manera de hacer esto, pero aún así evitar pasar en "Foo" a GetProperty y SetProperty?
B: ¿Encuentra una forma de decirle al compilador que no optimice en este caso?
Olvidé decir que no utilizo un diccionario para el almacenamiento, ya que tiende a tener un pequeño número de propiedades, escanear una lista plana es en realidad mucho más rápido (la línea divisoria de aguas es de aproximadamente 120 teclas). –
Puedes hacer que sean virtuales ... – BrainSlugs83