我需要能够确定我从缓存中获取的项是否可以转换为我传递给我的方法的对象的类型,以便我可以从缓存中删除该项事件,该项不是该类型的有效实例。
以下是我失败的尝试:
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'”
答案 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 :(得分: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;
}
}
答案 2 :(得分: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;
}