как закрыть класс, чтобы принимать только определенный типизированный объект - PullRequest
0 голосов
/ 14 января 2010

У меня есть этот класс, который принимает Dictionary<string,object>, который вызывается из разных мест в коде. Концепция словаря делает вещи нетипизированными и трудными для понимания того, что передать классу для функционирования, иначе он вызывает исключение во время выполнения. Поскольку Dictionary<string,object> является определением контракта, мне пришлось написать метод расширения для преобразования моего типа в словарь при вызове моего класса. Но как я могу закрыть этот класс, чтобы он принимал только определенный тип

Так, например.

public class CreateReport : IRep
{

public void SetParam(Dictionary<string,object> parm)
{
 // Here the dictionary param are been set. 
}

 public object RunRep()
{

}
}

ClassInvoker.Invoke(CreateReport , Dictionary<string,object>{"MyParam" , "World"});

Так вот, как обстоят дела сейчас.

Я изменил его, создав класс Property как

public class CreateReportProp
{
  public string MyParam { get;set;}
}

и имеет метод расширения как ConvertObjToDict

Итак, теперь мы должны сделать что-то вроде

ClassInvoker.Invoke(CreateReport , new CreateReportProp { MyParam = "World"}.ConvertObjToDict());

Но я бы хотел пойти дальше и закрыть класс, чтобы CreateReportClass вы могли только передать CreateReportParam, иначе компилятор выдает исключение.

Пожалуйста, дайте мне несколько идей о том, как я могу достичь этого.

Ответы [ 4 ]

0 голосов
/ 25 февраля 2010

Полагаю, вы используете класс CreateReport для многих конкретных отчетов? Если это так, у вас есть возможность выполнить проверку во время компиляции. Если класс CreateReport динамически вызывает отчет, т. Е. По имени, и у каждого отчета свои требования к параметрам, проверка на время компиляции невозможна.

В первом случае вы бы изменили подпись для класса CreateReport следующим образом:

public class CreateReport<T> : IRep, where T : CreateReportProp

В методе SetParam вы получите

public void SetParam(T param)

Для каждого конкретного отчета вы можете создать свой класс свойств, если он наследуется от CreateReportProp. Затем, когда вы создадите экземпляр класса отчета, вы укажете его.

CreateReport<MySpecificParam> myReport = new CreateReport<MySpecificParam>();
myReport.SetParam( new MySpecificParam() {...});

Если вы хотите внести меньше изменений в класс CreateReport, вы можете сделать так, чтобы ваш CreateReportProp реализовывал интерфейс IEnumerable или IDictionary, чтобы итерация параметров была более общей.

0 голосов
/ 14 января 2010

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

public interface IExample<t> : IExample
{
 AddDictionary(T);
}

public interface IExample
{
 AddDictionary(object)
}

затем запишите версию объекта для приведения в типизированную версию и реализуйте ее там.

Добавьте любые другие универсальные методы, которые вам нужны, и тогда используемые вами классы сами справятся, и все должны быть непростыми ... если я правильно вас понял.

0 голосов
/ 14 января 2010

Вы можете ограничить генерики, используя ключевое слово , где . Вот простой пример использования связанного списка

public class LinkedList<K,T> where K : IComparable
{
   T Find(K key)
   {
      Node<K,T> current = m_Head;
      while(current.NextNode != null)
      {
         if(current.Key.CompareTo(key) == 0)

            break;
         else      

            current = current.NextNode;
      }
      return current.Item; 
   }
   //Rest of the implementation 
}
0 голосов
/ 14 января 2010

Почему бы не использовать строго типизированный словарь:

public void SetParam<T>(Dictionary<string, T> parm)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...