Упрощение/инъекция для свойств c#C#

Место общения программистов C#
Ответить
Anonymous
 Упрощение/инъекция для свойств c#

Сообщение Anonymous »

У меня есть следующий код, предназначенный для управления полуструктурированными данными: < /p>

Код: Выделить всё

class SpecificSemiStructured : SemiStructured
{
[SemiStructuredField("field_a_key", ...)]
public string? FieldA
{
get => Get();
set => Set(value);
}

[SemiStructuredField("field_b_key", ...)]
public DateTime? FieldB
{
get => Get();
set => Set(value);
}
}

abstract class SemiStructured
{
private Dictionary _values;

protected SemiStructured(string data)
{
// Data is a concatenated string containing the key-value pairs
// These are separated by a specific delimiter
_values = ParseData(data);
}

protected TValue? Get([CallerMemberName] string propertyName = "")
{
// Code for retrieving the semi-structured field from the parsed dictionary
// This checks that the property name provided is:
//     1. The name of a valid property of 'T'
//     2. The name of a property of 'T' that has a 'SemiStructuredField' attribute
// Gets the attribute data for the given property

return Get(new SemiStructuredFieldInfo(attribute.Key, ...));
}

protected TValue? Get(SemiStructuredFieldInfo fieldInfo)
{
// Retrieves corresponding value from dictionary
// Handles data conversions
// Etc
// Returns a value
}
}
Как вы можете видеть, каждое свойство в полученном классе делает упрощенный вызов базового класса 'get (String) метод для Getter. Точно так же для сеттера. Это означает, что каждое свойство имеет одинаковый код как для Getter, так и для сеттера, за исключением предоставленного типа (неявное для сеттера). Основная причина использования GET (String) over get (SemistructurefieldInfo ) , так что имя поля не дублируется как для Getter, так и для сеттера. Хотя я знаю, что могу также просто использовать частное поле для хранения этой информации один раз, атрибут казался более чистым, и есть меньшая вероятность случайного ссылки на неправильное поле/ключ для различных свойств. Я посмотрел на IL Plaing Via Forody, но это кажется немного запутанным, и я не мог заставить его работать. Существующий код кажется довольно избыточным/повторяющимся, поэтому в идеале я хотел бы сводить его к:

Код: Выделить всё

class SpecificSemiStructured : SemiStructured
{
[SemiStructuredField("field_a_key")]
public string? FieldA { get; set; }

[SemiStructuredField("field_b_key")]
public DateTime? FieldB { get; set; }
}
... где параметр типа подразумевается из самого типа свойства.
Много лет назад я использовал пакет Fody's PropertyChanged для инъекции кода при создании приложения WPF/MVVM. Хотя я хотел бы здесь нечто подобное, я немного беспокоюсь о дополнительной сложности. Есть ли способ без ткачества IL? Я слышал, как люди используют генераторы источников для подобных вещей, но я считаю, что на это существуют более сильные ограничения? И я не хочу генерировать весь код, иначе наверняка нельзя ссылаться?

Подробнее здесь: https://stackoverflow.com/questions/797 ... properties
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»