2013-10-08 2 views
-2

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

Ниже мои неудачные попытки:

Get(dataCache, "cachedItemLabel", myObject); 

public static object Get(DataCache dataCache, string label, object obj) 
     { 
      try 
      { 
       //return (obj)dataCache.Get(label); 
       //return typeof(obj)dataCache.Get(label); 
       //return dataCache.Get(label) as typeof(obj); 

      } 
      catch (DataCacheException) 
      { 
       dataCache.Remove(label); 
      } 

      return null; 
     } 

Код выше результатов в следующих исключений:

return dataCache.Get(label) as typeof(obj); результат "Тип ожидается"

return typeof(obj)dataCache.Get(label); приводит "как ожидается"

return (obj)dataCache.Get(label); результата в "Тип или название пространства имен obj не могут быть найдены"

+1

Я предполагаю, что вы получаете исключение во время выполнения. Можете ли вы опубликовать исключение в своем вопросе? –

+0

Вы просто бросаете все, что бы прямо не возвращалось к объекту, так какой смысл, даже если бы вы могли это сделать? – Servy

+1

вы должны использовать дженерики. –

ответ

1

Если это вообще возможно, здесь вы просто должны использовать дженерики, таким образом вы можете фактически ввести возвращаемое значение указанного типа, и это довольно легко проверить, является ли объект этого типа:

public static object Get<T>(DataCache dataCache, string label) 
{ 
    try 
    { 
     object value = dataCache.Get(label); 
     if (value is T) 
      return (T)value; 
     else 
     { 
      dataCache.Remove(label); 
      return null; 
     } 
    } 
    catch (DataCacheException) 
    { 
     dataCache.Remove(label); 
     return null; 
    } 
} 

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

public static object Get(DataCache dataCache, string label, Type type) 
{ 
    try 
    { 
     object value = dataCache.Get(label); 
     if (value != null && type.IsAssignableFrom(value.GetType())) 
      return value; 
     else 
     { 
      dataCache.Remove(label); 
      return null; 
     } 
    } 
    catch (DataCacheException) 
    { 
     dataCache.Remove(label); 
     return null; 
    } 
} 

Наконец мы добираемся до подписи вы выбираете, в котором вы передаете в экземпляре некоторого типа, и вы хотите, чтобы убедиться, что возвращаемый объект имеет тип, назначаемый типу этого объекта. Это выполнимо, но особенно плохая практика, поэтому вы почти наверняка используете второй вариант, если не первый:

public static object Get(DataCache dataCache, string label, object typeObject) 
{ 
    try 
    { 
     Type type = typeObject.GetType(); 

     object value = dataCache.Get(label); 
     if (value != null && type.IsAssignableFrom(value.GetType())) 
      return value; 
     else 
     { 
      dataCache.Remove(label); 
      return null; 
     } 
    } 
    catch (DataCacheException) 
    { 
     dataCache.Remove(label); 
     return null; 
    } 
} 
+0

Вот и все! Спасибо, и жаль, что было непросто понять мою намеченную цель для метода. Отсутствие сна и наличие видения в туннелях убивают мою способность эффективно общаться. Я должен тебе обнять. –

2

Вы бросаете объект, используя (Object).

public static object Get(DataCache dataCache, string label, object obj) 
     { 
      try 
      { 
       return (object)dataCache.Get(label); 

      } 
      catch (DataCacheException) 
      { 
       dataCache.Remove(label); 
      } 

      return null; 
     } 
+1

Вам не нужно бросать его на объект. Это уже объект. – Servy

+0

@Servy правильно, мне нужно убедиться, что он соответствует типу параметра obj. –

+0

Тип параметра 'obj' -' object' ... –

0

Похоже, ваш вопрос приходит от того, чтобы отдать свой тип в obj вместо object

Хорошая новость заключается в том, что вы даже не должны бросить его.

public static object Get(DataCache dataCache, string label, object obj) 
    { 
     try 
     { 
      return dataCache.Get(label); 
     } 
     catch (DataCacheException) 
     { 
      dataCache.Remove(label); 
     } 

     return null; 
    } 
Смежные вопросы