Не думаю, что вам вообще нужно связываться с Delegate
. Вы можете хранить коллекцию Delegate
, но это не принесет никакой пользы, если вам нужно как-то узнать «реальный» тип каждого делегата, чтобы вы могли его разыграть. Это имеет тенденцию врезаться в стену. Не имеет смысла хранить коллекцию какого-либо общего типа, если для использования каждого из них вы уже должны знать его базовый тип. (Если мы просто собираемся привести к ожидаемому типу, мы могли бы использовать Dictionary<string, object>
.)
Словарь получателей с именем свойства в качестве ключа будет выглядеть так:
var getters = Dictionary<string, Func<Entity, object>>();
Для хранения геттера для свойства (PropertyInfo
обнаружено отражением)
getters.Add(property.Name, (entity) => property.GetValue(entity));
Хранить сеттеры сложнее. Вы можете хранить их так:
var setters = new Dictionary<string, Action<Entity, object>>();
... и добавьте недвижимость:
setters.Add(property.Name, (entity, value) => property.SetValue(entity, value);
Но предположим, что у вас есть сущность, имя свойства и значение, которое вы хотите установить для этого свойства. Вы можете извлечь Action
из словаря, но без каких-либо других элементов управления нет уверенности в том, что значение, которое вы намереваетесь установить, имеет правильный тип. Мы действительно вернулись к той же проблеме. Мы храним элементы как тип «наименее общего знаменателя» в коллекции, но чтобы использовать их, мы должны знать реальный тип. Преимущество полиморфизма заключается в том, что общий знаменатель - это все, что нам нужно знать.
Может быть, вы уже определились с тем, как правильно сохранить вторую часть, но есть хороший шанс, что, когда у вас будет словарь, вам будет трудно использовать то, что в нем. В этом случае может потребоваться сделать шаг назад и посмотреть, есть ли другой способ решения более крупной проблемы, не включающий этот подход.