Итак, я в последнее время борюсь с дженериками и не совсем понимаю, как решить эту проблему.Общий запрос с интерфейсом как общий параметр
В принципе у меня есть общая структура запроса, определенная как IRxQuery<T>
. Моя основная модель следует за одним правилом: T должен быть типом экземпляра. Вот заголовок реализации:
public class RxQuery<T> : IRxQuery<T>
where T : IQueryableObject
Одним из известных методов этого класса является Get
метода, который будет десериализацией объекта получил запрос в объект T. Метод вроде бы выглядит следующим образом:
protected virtual T Get(IDeserializableObject row)
{
var value = Activator.CreateInstance<T>();
// fill value
return value;
}
Теперь я хотел бы обновить свой запрос, чтобы он работал с интерфейсом. Я столкнулся с текущей проблемой: у меня есть интерфейс ISomething
, реализованный ObjectA
и ObjectB
. У меня будет случай, когда запрос может быть любым из них, и я пытаюсь его исправить, не добавляя наследование. Поэтому я пытался что-то вроде:
IRxQuery<ISomething> query;
if (isObjectA)
{
query = new RxQuery<ObjectA>();
}
else
{
query = new RxQuery<ObjectB>();
}
И, конечно же, вы знаете, что это не скомпилируется. Единственное решение, которое я думал до сих пор можно было бы добавить собственность к IRxQuery
типа выглядит как:
public Type InstanceType{ get; set; }
А затем обновить метод Get к этому:
protected virtual T Get(IDeserializableObject row)
{
T value = (T)Activator.CreateInstance(typeof(InstanceType))
}
Какой подход вы бы проконсультировать меня использовать, чтобы исправить эту проблему?
Спасибо!
Что означает 'IRxQuery'? Не могли бы вы сделать 'T' ковариант? – Lee