Я хочу сохранить некоторые поля поддержки свойств, объявленных в производных классах в защищенной Hashtable, содержащейся в базовом классе. Использование этого механизма в производных классах должно быть простым, насколько это возможно.MethodBase as Hashtable Key
Итак, могу ли я использовать MethodBase.GetCurrentMethod()
для предоставления информации о вызове свойства (getter - свойства доступны только для чтения), поэтому его можно признать единственным и единственным свойством, имеющим доступ к этому конкретному полю поддержки?
EDIT:
В принципе, я хочу, чтобы реализовать шаблон:
private SomeClass _someProperty = null;
private SomeClass SomeProperty
{
if (_someProperty == null)
{
_someProperty = new SomeClass();
}
return _someProperty;
}
выглядеть примерно так:
private SomeClass SomeProperty
{
return GetProperty(delegate
{
var someProperty = new SomeClass();
return someProperty;
};
}
И в базовом классе
private System.Collections.Hashtable _propertyFields = new System.Collections.Hashtable();
protected T GetProperty<T>(ConstructorDelegate<T> constructorBody)
{
var method = new System.Diagnostics.StackFrame(1).GetMethod();
if (!_propertyFields.ContainsKey(method))
{
var propertyObject = constructorBody.Invoke();
_propertyFields.Add(method, propertyObject);
}
return (T)_propertyFields[method];
}
protected delegate T ConstructorDelegate<T>();
Причина, по которой я хочу сделать это, - это упростить использование свойств. Я использую частные свойства для создания некоторых объектов и использования их вокруг класса. Но когда я храню свои поддерживающие поля в одном классе, у меня есть тот же доступ к ним, что и для свойств, поэтому я (означает, что пользователь, который будет создавать некоторые производные классы в будущем) может случайно использовать фоновое поле вместо свойства, поэтому я хотел ограничить доступ к полям резервного копирования, но позвольте создать объект и использовать его.
Я пытался использовать ObsoleteAttribute на отступающих таких областях, как это:
[Obsolete("Don't use this field. Please use corresponding property instead.")]
private SomeClass __someProperty;
private SomeClass _someProperty
{
#pragma warning disable 0618 //Disable Obsolete warning for property usage.
get
{
if (__someProperty== null)
{
__someProperty = new SomeClass();
}
return __someProperty ;
}
#pragma warning restore 0618 //Restore Obsolete warning for rest of the code.
}
Но, во-первых, я не могу заставить пользователя использовать этот шаблон, а во-вторых, это на много кода, чтобы написать в производном классе, который, как я уже упоминал выше, хочу быть как можно более простым.
Как насчет использования некоторых примеров? Это почти похоже на ['ExpandoObject'] (https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (v = vs.110) .aspx) может подойти – weston
Почему вы хотите хранить резервные поля в базовом классе? Ваш производный класс должен выставлять своих частных членов через общедоступные свойства, а частные поля должны оставаться закрытыми для производного класса. Вы пытаетесь поддерживать или совместно использовать состояние между производными объектами? –
@IanR.О'Брайен, я отредактировал вопрос. – Szybki