0

下面的代码在MemoryCache. 这些对象可以有不同的类型。

我想要一个能够从中返回对象的方法,MemoryCache但返回类型可以不同。

在我的示例中,它是 2,但可以更多。在我的示例中,类型返回是IT1List<IT2>

我怎样才能实现这个方法?

我想要这样的方法(返回的类型可能因键而异):

public ??? GetObjectFromKey(string key)
{
    return _cache.Get(key);
}

谢谢,

MemoryCache _cache = MemoryCache.Default;

var it1 = new T1 { Name = "My" };
var it2 = new List<IT2>().Add(new T2 { Age = 5 });

_cache.Add("ITC1", it1, new CacheItemPolicy());
_cache.Add("ITC2", it2, new CacheItemPolicy());

var typeName = _cache.Get("ITC1").GetType();

public interface IT1
{
    string Name { get; set; }
}

public class T1 : IT1
{
    public string Name { get; set; }
}

public class T2 : IT2
{
    public int Age { get; set; }
}

public interface IT2
{
    int Age { get; set; }
}
4

3 回答 3

1

缓存的返回类型必须是objectdynamic。您没有其他可能性,因为您放入缓存中的类没有任何共同点。

于 2013-06-06T09:06:01.013 回答
0

如果您在调用 GetObjectFromKey 时知道类型,则可以使用泛型:

public T GetObjectFromKey(string key)
{
    object returnObj = _cache.Get(key);
    if(returnObj.GetType() == typeof(T)) // may need to also check for inheritance
    {
         return (T) returnObj;
    }
    else
    {
         throw new Expcetion("InvalidType");
    }
}

然后当你调用它时:

IT1 myObj = GetObjectFromKey<IT1>("mykey");

正如所承诺的,这里是您如何在运行时从任意类型构造泛型方法(尽管我不明白这会有什么帮助!):

Type t = typeof(Something); // your type at run time
Type cacheType = _cache.GetType(); // The type that has the GetObjectFromKeyMethod

MethodInfo lGenericMethod = cacheType.GetMethod("GetObjectFromKey");
MethodInfo lTypedMethod = lMethod.MakeGenericMethod(t);

dynamic lReturn = lTypedMethod.Invoke(_cache, new object[] { "mykey" } );

虽然很明显你不能做任何事情,lReturn因为你在编译时不知道类型,你可以只返回一个对象(或者一些通用接口)并调用GetType它。尽管如此,编写这样有趣的反射方法还是很有趣的:P

于 2013-06-06T09:16:27.770 回答
0

泛型?

public T GetObjectFromKey<T>(string key)
{
    return (T)_cache.Get(key);
}
于 2013-06-06T09:18:54.173 回答