У меня есть массив, который хранит словарь типов:Динамическая Generic декларация типа Т
//The dictionary:
Dictionary<CacheKey,Type> TypeLookup;
//This is the enum:
public enum CacheKey
{
UserProfile,
CustomerQuickSearch,
CommissionConfiguration
}
Я хотел бы использовать этот словарь, чтобы объявить переменную типа T
//instead of
T myvar;
//I want to dynamically declare myvar as:
//1)get the type for the cacheKey from the dictionary:
Type type = TypeLookup[cacheKey];
//2)declare myvar as the corresponding Type:
type myvar;
Фон что я создаю инфраструктуру распределенного кэширования. У меня очень маленький CachingProvider, который позволяет вам обновлять элемент в кеше.
Я хотел бы разоблачить этот метод как веб-сервис, чтобы все серверы в моей ферме могли обновлять свой кеш. Но я хотел бы иметь только один метод, открытый как веб-сервис, который затем обновляет соответствующий элемент в кеше.
Это метод, который я пытаюсь выставить:
public static void UpdateCacheEntryItem<T>(CacheKey cacheKey, int id)
{
//look up the cacheEntry in cache which is a dictionary.
Dictionary<int, T> cacheEntry = (Dictionary<int, T>) CacheRef[cacheKey.ToString()];
//call the corresponding method which knows how to hydrate that item and pass in the id.
cacheEntry[id] = (T)HydrateCacheEntryItemMethods[cacheKey].Invoke(id);
}
Вещи, которые я пробовал: 1) Я попытался обнажая метод непосредственно в качестве службы WCF, но, конечно, не работает, потому что от метода. 2) Я попробовал лить Словарь, который бы нашел, потому что мне не нужно делать ничего с возвращаемым значением, мне просто нужно обновить элемент в кеше. Но это тоже не сработало. Ошибка, которую я получаю: невозможно сбрасывать объект типа «System.Collections.Generic.Dictionary 2[System.Int32,CachingPrototype.CustomerQuickSearch]' to type 'System.Collections.Generic.Dictionary
2 [System.Int32, System.Object] '.
Ваши комментарии были очень полезными и помогли мне ответить на мой вопрос. Решение, которое я придумал, состоит в том, чтобы просто включить мой метод WCF в оператор switch, чтобы я мог вызвать метод UpdateCacheEntryItem с правильным типом T. Поскольку нет способа конвертировать из Type в общий оператор T, это единственный вариант. Так как у меня не так много типов в кеше, это работает очень хорошо. (Другим решением будет использовать интерфейс, как указано ниже, но это не будет так сильно типизированных, как хотелось бы.)
[OperationContract]
public void UpdateCacheEntryItem(CacheKey cacheKey, int id)
{
switch (cacheKey)
{
case CacheKey.UserProfile:
CacheProvider.UpdateCacheEntryItem<UserProfile>(cacheKey, id);
break;
case CacheKey.CommissionConfig:
CacheProvider.UpdateCacheEntryItem<CommissionConfig>(cacheKey, id);
break;
case CacheKey.CustomerQuickSearch:
CacheProvider.UpdateCacheEntryItem<CustomerQuickSearch>(cacheKey, id);
break;
default:
throw new Exception("Invalid CacheKey");
}
Спасибо всем за вашу помощь, вы великолепны!
Дубликат http://stackoverflow.com/questions/1437162/dynamic-casting? –
Небольшой контекст будет приятным. Что вы на самом деле пытаетесь достичь? Возможно, вместо этого будет использоваться общий интерфейс или фабричный класс? – tvanfosson
Я смущен - что вы пытаетесь кэшировать - тип или значение? и что вы используете в качестве ключа кеширования? – mfeingold