Хорошо, так что я просто хочу извиниться за плохой код, который был в моем примере.Но, надеюсь, если вы посмотрите на это какое-то время, вы увидите, где это пошло не так.Но вот ответ, который я придумал.Я думаю, что может быть лучший способ преобразования, но я хотел найти решение, которое не требовало бы изменения класса BusinessBase, поскольку это основной компонент CSLA, а не тот, который я хочу изменить.Вот код, который я придумал, который работает:
interface A<T>
{
T Save();
}
interface IConcreteInterface : A<IConcreteInterface>
{
}
class BusinessBase<T>
where T : BusinessBase<T>
{
public T Save()
{
return (T)this;
}
}
class D<T, U> : BusinessBase<T>
where T : BusinessBase<T>, A<U>
where U : A<U>
{
public new U Save()
{
return (U)(object)base.Save();
}
}
class ConcreteClass : D<ConcreteClass, IConcreteInterface>, IConcreteInterface
{
}
Изменение, которое заставило его работать, было следующим: return (U) (object) base.Save ();
До того, как меня не поместили в (U) приведение к семплу, потому что он не скомпилировался бы так.Поскольку нет никакой связи между T и U, которая может быть определена.Таким образом, единственный способ обойти это - привести возвращаемое значение T из Save к (объекту), который, конечно, будет способен приводить к чему угодно.
Вы заметили, что я также добавил ограничение типа для небольшой дополнительной защиты отприведение ошибок в том, что я удостоверяюсь, что T имеет тип A и что U имеет тип A. Это гарантирует, что оба типа имеют одинаковый интерфейс.
Если у кого-то есть что-то красивее, я открыт для предложений.Но сейчас это работает, и я чувствую себя несколько хорошо об этом.Вы можете сделать то, что я сделал, что, по крайней мере, потребовало T для реализации. Это не красиво, и вы можете применить немного больше