I have the following base class:
public abstract class CheckBase<TInput, TOrder, TReply> : ICheck<TInput, TOrder, TReply> where TInput : ITicker where TReply : ITicker {
public abstract IEnumerable<TReply> Compute(IEnumerable<TOrder> orders);
public virtual IEnumerable<TReply> Compute(IEnumerable<TInput> inputs, Func<TInput, TOrder> mapper) {
return Compute(inputs.OrderBy(x => x.Stamp).Select(x => mapper(x)));
}
And a derived class:
public class CheckSystem : CheckBase<ITicker, (DateTimeOffset Stamp, Decimal? Value), CheckSystem.Reply> {
public override IEnumerable<Reply> Compute(IEnumerable<(DateTimeOffset Stamp, Decimal? Value)> orders) {
// Just for testing
return new List<Reply>()
}
public class Reply(DateTimeOffset stamp, Decimal? value) : ITicker {
public DateTimeOffset Stamp { get; set; } = stamp;
public Decimal? Value { get; set; } = value;
}
}
I am using it as follows:
public class SystemModel(DateTimeOffset stamp, Decimal? reference) : ITicker {
public DateTimeOffset Stamp { get; set; } = stamp;
public Decimal? Reference { get; set; } = reference;
}
CheckSystem checkSystem = new CheckSystem();
IEnumerable<SystemModel> models = getModels();
var result = checkSystem.Compute(models, x => (x.Stamp, x.Reference));
I get an error in x.Reference
because x
is considered ITicker and not SystemModel.
How can I change my code so that the method
public virtual IEnumerable<TReply> Compute(IEnumerable<TInput> inputs, Func<TInput, TOrder> mapper)
“knows” the type of TInput and not only that it implements ITicker so I can access all its properties?