Сделайте это метод отражения Syplesfe
-
01-10-2019 - |
Вопрос
class CustomerMessage
{
private string name;
private Dictionary<MethodBase, object> changeTrackingMethods =
new Dictionary<MethodBase, object>();
public int Id { get; set; }
public string Name {
get { return this.name; }
set
{
this.name = value;
this.PropertyChanged("SetName", value);
}
}
private void PropertyChanged(string behaviorMethod, object value)
{
var method = typeof(Customer).GetMethod(behaviorMethod);
this.changeTrackingMethods.Add(method, value);
}
public void ApplyChanges(Customer c)
{
foreach (var changedProperty in this.changeTrackingMethods)
changedProperty.Key.Invoke(c, new object[] {
changedProperty.Value
});
}
}
Как вы можете видеть, я отслеживаю изменения этого входящего сообщения, чтобы запустить изменения на другом объекте. Способ прогона пропускается для PhormageChanged в виде строки. У кого-нибудь есть наконечник, как я могу сделать этот тип безопасным?
Решение
Что-то вроде этого?
class CustomerMessage
{
private string name;
private List<Action<Customer>> changeTrackingMethods =
new List<Action<Customer>>();
public int Id { get; set; }
public string Name {
get { return this.name; }
set
{
this.name = value;
this.changeTrackingMethods.Add(c => { c.SetName(value) });
}
}
public void ApplyChanges(Customer c)
{
foreach (var action in this.changeTrackingMethods)
{
action(c);
}
}
}
Другие советы
Таким образом, вы хотите избежать прохождения имени метода в виде строки? Почему бы не получить объект метода в установке?
public string Name {
get { return this.name; }
set
{
this.name = value;
this.PropertyChanged(typeof(Customer).GetMethod(behaviorMethod), value);
}
}
private void PropertyChanged(MethodBase method, object value)
{
this.changeTrackingMethods.Add(method, value);
}
Вместо того, чтобы сохранить «операцию, которая должна быть сделана» как пара метода и аргумента, который следует передавать ему с использованием отражения, вы можете хранить делегат, который должен быть выполнен. Самый простой способ сделать это - хранить список типов List<Action<Customer>>
- Тогда в ApplyChanges
Метод, вы можете повторить перечень и запустить все действия.
В случае, если вы не используете .NET 3.5 и C # 3.0 (который определяет общий делегат Action
И поддерживает лямбда выражения), вы все еще можете написать это в C # 2.0:
// you can define a delegate like this
delegate void UpdateCustomer(Customer c);
// and you could use anonymous methods
// (instead of more recent lambda expressions)
list.Add(delegate (Customer c) { c.SetName("test"); });
Редактировать: Похоже, я был медленнее с написанием кода, но я буду держать это здесь как объяснение - решение «DTB» делает именно то, что я описал.