C # Динамическое значение TValue в словаре

#c# #visual-studio-2012

#c# #visual-studio-2012

Вопрос:

Этот вопрос может быть немного сложным, однако, пожалуйста, читайте дальше:

У меня есть набор хранимых процедур, которые выполняются, и все их данные хранятся в словаре.

Например, getEventTypes хранится в словаре eventTypeResult, а getEventCats хранится в словаре dictonary eventCatResult.

Можно ли динамически запускать следующую строку:

 Dictionary<string, eventTypeResult> resultsList = (Dictionary<string, eventTypeResult>)resultsObject;
  

Где это может выглядеть примерно так:

 var resultType = eventTypeResu<

Dictionary<string, resultType > resultsList = (Dictionary<string, resultType >)resultsObject;
  

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: попытка 2 объяснить, почему оно должно быть динамическим

В настоящее время мой код выглядит следующим образом:

 if (resultType == "eventTypeResult")
{
    Dictionary<string, eventTypeResult> resultsList = (Dictionary<string, eventTypeResult>)resultsObject;
}
else if (resultType == "eventDateResult")
{
    Dictionary<string, eventDateResult> resultsList = (Dictionary<string, eventDateResult>)resultsObject;
}
else if
else if
else if
ect
ect
  

Разве это не может быть просто так:

 var resultType = eventTypeResu<

Dictionary<string, resultType > resultsList = (Dictionary<string, resultType >)resultsObject;
  

Комментарии:

1. что вы имеете в виду динамически? в чем проблема с этим так, как оно есть?

2. Извините, это очень сложно объяснить. Смотрите мою правку 🙂 Спасибо

3. К сожалению, ввод текста таким образом невозможен. Вы уже видите столько, сколько при попытке var resultType = eventTypeResu< , что это приведет 'eventTypeResult' is a 'type' but is used as a 'variable' к ошибке. Лучшее решение зависит от вашей конечной цели: вы ищете что-то переупаковываемое для других случаев? Вы хотите объединить код, будете выполнять те же операции с результатами eventTypeResult и eventDateResult иметь похожие подписи? Или вам нужно обрабатывать каждый случай практически исключительно, в зависимости от типа?

Ответ №1:

«Динамический», вероятно, не лучший подход в строго типизированном языке… То, что вы пытаетесь создать, — это коллекция значений произвольного имени, подобная различным типам кэша в .Net Framework. вам необходимо передать общий тип, который может содержать все ваши типы результатов.

если у вас есть такой тип resultType , от которого наследуются все остальные типы результатов, тогда используйте его: Dictionary<string, resultType > . вы можете поместить в значение все, что захотите, если оно является подклассом resultType . Если вы этого не сделаете, используйте Dictionary<string, object >

если вам нужно выполнить приведение между словарями, вы всегда можете (фактический тип объекта должен совпадать):

 var thing = new Dictionery<int> ()
var objectThing = thing.Cast<Dictionery<object>();
  

если вы хотите динамическое значение, вы можете:

 Dictionary<string, resultType > dict;
dyamic value = dict["something"];
value.WhaterverYouWant() // if this method doesnt exist this will compile but crash at runtime...
  

Комментарии:

1. Ваш ответ решает проблему, но вы не учли бокс, когда мы используем object в словаре TValue, это увеличивает нагрузку на GC и влияет на нашу производительность. Есть ли у вас какой-либо другой подход к решению этой проблемы?