C#: Определите тип производного объекта от статического метода базового класса

Другой вариант - использовать условие, которое потенциально может использовать индекс для этого столбца:

where date >= timestamp '2018-01-01 00:00:00' 
  and date < timestamp '2019-01-01 00:00:00';

Если вы не хотите писать длинный «литерал метки времени» и просто передавать число к запросу вы можете использовать make_timestamp()

where date >= make_timestamp(2018,1,1,0,0,0) 
  and date < make_timestamp(2019,1,1,0,0,0);

Если это значение является параметром, который вы можете использовать:

where date >= make_timestamp(?,1,1,0,0,0) 
  and date < make_timestamp(? + 1,1,1,0,0,0);

Функция извлечения также будет работать: [ 119]

where extract(year from date)::int = 2018

или используя to_char ()

where to_char(date, 'yyyy') = '2018'
5
задан Steve Hawkins 18 November 2008 в 21:20
поделиться

6 ответов

Попытка с помощью дженериков:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

Демонстрационное использование:

DerivedClass d = BaseClass.Create<DerivedClass>();
12
ответ дан 18 December 2019 в 06:23
поделиться

Сводка

Существует две основных опции. Более хороший и более новый должен использовать дженерики, другой должен использовать отражение. Я предоставляю обоим в случае, если необходимо разработать решение, которое работает до.NET 2.0.

Дженерики

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}

Где использование было бы:

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();

Отражение

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}

Где использование было бы (разделение по поводу двух строк для удобочитаемости):

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));
5
ответ дан 18 December 2019 в 06:23
поделиться

Вы хотите создать новый экземпляр полученных из другого экземпляра полученных, с помощью статического метода фабрики для абстрактного базового класса? если так, интересно Почему... Но...

 public abstract class MyBase
 {
    public static T GetNewDerived<T>() where T : MyBase, new()
    {
        return new T();
    }    
 }
 public class DerivedA : MyBase
 {
    public static DerivedA GetNewDerived()
    {
        return GetNewDerived<DerivedA>();
    }
 }

 public class DerivedB : MyBase
 {
    public static DerivedB GetNewDerived()
    {
        return GetNewDerived<DerivedB>();
    }
 }     

Это то, что Вы хотите?

4
ответ дан 18 December 2019 в 06:23
поделиться

Кажется, что необходимо сделать Создавание () краткий обзор метода. И после того как Вы делаете это, Вы могли бы также переименовать его и сделать его конструктором также. Затем у Вас может быть другой Init () метод, который Вы называете после того, как объект создается, если Вы должны, и нормальные эффекты полиморфизма обработают вещи.

3
ответ дан 18 December 2019 в 06:23
поделиться

Вы не можете сделать этого без внешней информации; или тип производного класса, экземпляр его или полностью определенное название производного класса. Любой из них эквивалентен тому, что Вы уже делаете; нет лучшего решения, о котором я знаю. Самая природа статических методов устраняет что-либо более изящное.

1
ответ дан 18 December 2019 в 06:23
поделиться

Я не уверен, что Ваши цели дизайна всего лишь, от какого Вы спросили, это кажется, что могло бы закончиться с большим количеством запаха кода. Я думаю, что необходимо действительно изучить Инверсию управления (IoC) / шаблоны разработки Внедрения зависимости (DI), которые реализованы в многочисленных платформах, таких как Microsoft Unity, замок Windsor, StructureMap, Ninject, Spring. Сеть и т.д.

Я думаю, смотрите ли Вы на использование контейнера МОК, оно решит Вашу проблему намного более чистым и слабо связанным способом.

0
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: