В C# (. NET Core), есть ли простой способ получить ссылку на свойство экземпляра класса из самого класса?
Под этим я подразумеваю если у меня есть класс:
class A {
public int SomeProp { get; set; }
}
, я бы хотел получить ссылку на SomeProp
, как PropertyInfo
или аналогичный.
Я знаю, что могу сделать что-то вроде typeof(A).GetProperty("SomeProp")
, который работает, но довольно подробен и не является константой (что означает, что я не мог использовать его, например, в атрибуте).
У меня есть сопоставитель, который использует два метода: Func<TInput, TValue>
(принимает объект input
и возвращает какое-то значение) и Action<TOutput, TValue>
(принимает output
и возвращаемое значение из предыдущего метода).
Во втором методе я в основном заканчиваю имея их много: (o, v) => o.SomeProp = v
и я ищу способ упростить эту часть, чтобы просто иметь возможность предоставить ссылку на само свойство, и я обрабатываю фактическое назначение за кулисами.
В идеале , это будет что-то (это не строка), которое можно поместить в атрибут, чтобы я мог просто пометить eac h метод:
[AssignTo(A.SomeProp)]
public TValue GetValue(TInput in) => in.CalcValue();
Я знаю, что могу передать имя опоры в виде строки, но тогда это приводит к обходу целой кучи различных проверок (например, проверка того, используется ли свойство), а также может приводят к глупым орфографическим ошибкам.
И просто для ясности причина использования отдельных, в основном единственного свойства, методов сопоставления вместо простого присваивания заключается в том, что реальные методы получения значений в большинстве случаев намного сложнее и необходимо поддерживать добавление методов, подобных DI, на основе критериев времени выполнения. Шаблон, который я использую, является одним из самых чистых для такого подхода.