Использование обобщений в C # для условного сравнения - PullRequest
3 голосов
/ 18 августа 2011

В моем сценарии у меня есть два типа объектов.План и уровень .Каждый из них имеет определенные значения, в то время как уровень имеет 3 дополнительных значения (Rate, Min и Max).

Я хотел бы создать универсальный метод для условной оценки, может ли новый объект быть записан вбаза данных, основанная на следующих условиях:

Создание:

  1. Уровень: ((o1.Rate!=o2.Rate) || ((o1.Start!=o2.Start) && (o1.End!=o2.End))) && (MinVal && MaxVal)
  2. Уровень или план: (o1.Name!=o2.Name)
  3. Уровень или план: только один может иметь (Active == true), остальные должны быть ложными.

Можно ли создать универсальный метод для чего-то подобного?Если да, есть ли примеры чего-то подобного?Или у кого-нибудь есть предложения?

спасибо!

MORE: Итак, у меня есть список объектов, и мне нужно сравнить вновь созданный объект с каждым другим объектом вбазы данных, прежде чем я на самом деле записать ее в базу данных.

Ответы [ 4 ]

2 голосов
/ 18 августа 2011

Для того, чтобы это работало, универсальному методу (или типу) потребуется ограничение, позволяющее ему понимать все перечисленные вами отдельные свойства (Rate, Date, MinVal, MaxValue , Start и End).

Если все типы, о которых вы беспокоитесь, происходят из одного и того же базового класса или интерфейса, вам не нужны универсальные шаблоны - просто создайте метод, который принимает два аргумента этого базового типа.

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

1 голос
/ 18 августа 2011

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

База данных обычно очень эффективна для таких сравнений - и если мне когда-либо понадобится запустить несколько экземпляров программы параллельно и / или создать объекты независимо от разных программ, решение для базы данных позаботится об этом ...

РЕДАКТИРОВАТЬ - согласно комментарию / запросу:
Я обычно работаю с Oracle, поэтому у меня нет под рукой хранимой процедуры SQL Server ... но эти ссылки должны дать некоторое представление:

0 голосов
/ 18 августа 2011

Ваши варианты в основном:

  1. использовать общий унаследованный базовый объект с этими реквизитами
  2. реализовать интерфейс с этими реквизитами
  3. используйте отражение, чтобы получить значения и сравнить их, если объекты действительно не связаны или если вы знаете только сравниваемые значения полей во время выполнения.

Рид упомянул ниже динамические объекты - это может сработать, но я должен был бы доверять его ответу, но, тем не менее, включал динамические требования.

0 голосов
/ 18 августа 2011

Может быть, что-то вроде этого:

// I'm making up the types here; modify to match your actual types
public interface IMyObject {
    public int Rate { get; set; }
    public DateTime Date { get; set; }
    public int MinVal { get; set; }
    public int MaxVal { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

public static class MyObjectFactory {
    public static T Create<T>(int rate, DateTime date, /* etc.. */) 
            where T : IMyObject, new() {

        if (/* tests */) {
            throw new MyObjectException("Constraint violated ...");
        }             

        T obj = new T();

        obj.Rate = rate;
        obj.Date = date;
        // etc ....

        return obj;
    }
}

И тогда вы бы использовали это так:

public class SomeMyObject : IMyObject {
    // implementation omitted for brevity ...
}

// somewhere:
SomeMyObject obj = MyObjectFactory.Create<SomeMyObject>(rate, date, /* etc. */);

Это то, что вы просите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...