-2

我需要能够确定我从缓存中取出的项目是否可以转换为我传递给我的方法的对象的类型,以便我可以从缓存中删除项目item 不是该类型的有效实例。

以下是我失败的尝试:

 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’”

4

3 回答 3

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;
        }
于 2013-10-08T20:09:27.920 回答
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;
    }
}
于 2013-10-08T20:38:29.610 回答
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;
    }
于 2013-10-08T20:11:37.867 回答