Я думаю, у вас уже есть большая часть того, что вам нужно.
Чего не хватает, так это самого атрибута.
Вы бы определили его так (вы можете прочитать больше об AttributeUsage-Attribute здесь ):
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
class TimeSeriesSerializationAttribute : Attribute
{
public TimeSeriesSerializationType SerializationType { get; }
public TimeSeriesSerializationAttribute(TimeSeriesSerializationType timeSeriesSerializationType)
{
SerializationType = timeSeriesSerializationType;
}
}
Теперь вы можете добавить те, что выше ваших свойств, простокак ты уже писал.
Время для оценочной части.Вы можете использовать что-то вроде этого, чтобы прочитать все свойства и использовать их для сериализации ваших TimeSeries.
Кстати, если атрибут, который вы получаете, становится нулевым, атрибут просто не устанавливается.Вы можете либо полностью пропустить свойство, либо использовать SerializationType по умолчанию, что бы вам ни понадобилось.
public static void SerializeToSomewhere(YourClassWithTimeSeries instance) {
// get all public, instance properties
IEnumerable<PropertyInfo> allProps = typeof(YourClassWithTimeSeries).GetProperties(BindingFlags.Public | BindingFlags.Instance);
// only take TimeSeries-properties
IEnumerable<PropertyInfo> timeSeriesProps = allProps.Where(p => p.PropertyType == typeof(TimeSeries));
foreach (PropertyInfo property in timeSeriesProps)
{
// get the attribute
TimeSeriesSerializationAttribute attribute = property.GetCustomAttribute<TimeSeriesSerializationAttribute>();
if (attribute == null) continue; // or do something else like use a default SerializationType
// get the value
TimeSeries value = (TimeSeries)property.GetValue(instance, null);
// serialize using the type from the attribute
string serializedValue = value.Serialize(attribute.SerializationType);
// Do whatever with the serialized value (for example save it to a file or whatever)
}
}
Надеюсь, это поможет вам.Есть также множество учебников и документов по атрибутам, если вам нужна дополнительная информация.Я также постараюсь ответить на вопросы, которые у вас могут возникнуть, поэтому не стесняйтесь задавать.
Редактировать:
Небольшая вещь, чтобы добавить.В вашем коде ваш класс TimeSeries предоставляет открытые поля Times и Values.Ты не должен этого делать.Вместо этого:
public List<DateTime> Times = new List<DateTime>();
public List<decimal> Values = new List<decimal>();
Вы должны сделать это.Это мешает вам случайно назначить его снова внутри или за пределами класса.
public List<DateTime> Times { get; } = new List<DateTime>();
public List<decimal> Values { get; } = new List<decimal>();