#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 и влияет на нашу производительность. Есть ли у вас какой-либо другой подход к решению этой проблемы?