2013-06-06 34 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方法返回對象。 –