Учитывая такую структуру:
class Parent { }
class Child : Parent { }
У меня есть метод, который принимает универсальный тип с ограничением на тип объекта Child
static void doSomething<T>() where T : Child
{
if (typeof(T) == typeof(Parent))
{
/* ... */
}
else if (typeof(T) == typeof(Child))
{
/* ... */
}
}
Единственная проблема в том, что если у меня есть:
class implementsParent : Parent { }
class implementsChild : Child { }
вызов универсального метода с типом ImplementsParent не будет работать:
doSomething<implementsParent>(); // compile error
doSomething<implementsChild>(); // works fine
Я пытаюсь обойти тот факт, что перегрузка универсального метода не учитывает ограничений.
Что я могу сделать здесь?
@ Сандер Рейкен: Дополнительная информация.
Мне нужно использовать универсальный тип для вызова метода инфраструктуры ORM следующим образом:
static void doSomething<T>() where T : Child
{
if (typeof(T) == typeof(Parent))
{
Parent obj = orm.GetObject<T>(criteria);
}
else if (typeof(T) == typeof(Child))
{
Child obj = orm.GetObject<T>(criteria);
}
}
с ограничением на то, где T: Parent вызывает разрыв дочернего объекта obj = orm.GetObject (), поскольку T не может быть преобразован в тип 'Child'
@ Ричард Хейн:
Изначально у меня было 2 метода, каждый с ограничением на один из дочерних / родительских (в данном случае: XPObject и XPCustomObject из DevExpress ORM - XPObject наследуется от XPCustomObject).
Методы выглядят так:
static void removeBlank<T>(UnitOfWork uow) where T : XPObject
{
T blank = uow.GetObjectByKey<T>(0):
if (blank != null)
{
blank.Delete();
uow.CommitChanges();
}
}
XPCustomObject используется (в данном случае), чтобы иметь PK типа short (вместо int по умолчанию в XPObjects). Таким образом, единственное изменение заключается в вызове для получения объекта:
static void removeBlankCustomObject<T>(UnitOfWork uow) where T : XPCustomObject
{
T blank = uow.GetObjectByKey<T>((short)0);
if (blank != null)
{
blank.Delete();
uow.CommitChanges();
}
}
Разница минимальна, поэтому я хочу объединить два метода вместе.