2013-06-06 35 views
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; } 
} 
+2

什么问题? –

+0

因此,您可以使用泛型的反射来调用带有正确类型参数的get方法,但是如何比返回对象更好。在编译时,你不会知道类型(因为你不知道类型!),你可以使用GetType找到它,如果你只是返回一个对象, –

+0

Voila,更新:) –

回答

1

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

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

+0

当然,但我不希望找到一个没有提供类型的方式,但它可能是不可能的。 –

+0

好吧,那么你可以使用反射来获取类型并在运行时构造方法(稍后我将添加它,远离编译器!),但是,如果你不是在编译时使用类型,为什么不只是返回一个对象? –

+0

补充说,虽然不知道它会如何帮助。你最终想达到什么目的? –

0

泛型?

public T GetObjectFromKey<T>(string key) 
{ 
    return (T)_cache.Get(key); 
} 
+0

当然,但我期望找到一种方式,不提供类型,但它可能是不可能的。 –

+0

如果在编译时不知道类型,它将不起作用,因为Get方法返回对象。 –