我有一个方法,其签名看起来像这样:
public IList<T> GetReferenceData<T>(TransactionManager transactionManager = null)
{
IList<T> collection;
var cacheData = DataCacheManager.Instance.GetCacheItem(typeof(T).Name);
if (cacheData != null)
{
collection = (IList<T>)cacheData;
}
else
{
collection = this.GetReferenceDataNoCache<T>(transactionManager);
DataCacheManager.Instance.AddCacheItem(typeof(T).Name, collection);
}
return collection;
}
我有另一种方法允许我传入一个字符串,该字符串将该字符串转换为适当的类型。然后我想调用上面的方法。
public IList GetReferenceDataByType(string referenceType)
{
// this works and returns the appropriate type correctly
var type = this.GetEntity(referenceType);
// now I'm stuck
return this.GetReferenceData<?>();
}
什么取代了问号?
答案 0 :(得分:1)
如果我理解你的问题你想要这样的事情:
public IList GetReferenceDataByType(string referenceType)
{
// this works and returns the appropriate type correctly
var type = this.GetEntity(referenceType);
var method = this.GetType().GetMethod("GetReferenceData");
var generic = method.MakeGenericMethod(type);
return (IList) generic.Invoke(this, new object[] { null });
}
请注意,IList<T>
未实现IList
,因此强制转换可能会失败。
答案 1 :(得分:0)
看起来你应该改变你的方法
您应该将GetReferenceData
和GetReferenceDataNoCache
重写为非通用方法,而不是从非通用方法中调用泛型方法:
public IList GetReferenceData(Type type, TransactionManager transactionManager = null)
{
// ...
}
private IList GetReferenceDataNoCache(Type type, TransactionManager transactionManager = null)
{
// ...
}
public IList<T> GetReferenceData<T>(TransactionManager transactionManager = null)
{
return (IList<T>)GetReferenceData(typeof(T), transactionManager);
}
查看您的代码:T
中GetReferenceData<T>
的唯一好处是typeof(T)
。
事实上,其余方法都是非通用的。
答案 2 :(得分:0)