方法返回值,具体取决于集合项类型
本文关键字:集合 类型 取决于 返回值 方法 | 更新日期: 2023-09-27 18:17:06
下面的代码在MemoryCache
中添加了一些对象。这些对象可以有不同的类型。
我想要一个能够从MemoryCache
返回对象的方法,但返回类型可以不同。
在我的示例中,它是2,但可以更多。在我的示例中,类型返回值为IT1
或List<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; }
}
缓存的返回类型必须是object
或dynamic
。没有其他的可能,因为放入缓存中的类没有任何共同之处。
泛型?
public T GetObjectFromKey<T>(string key)
{
return (T)_cache.Get(key);
}
如果你知道调用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