如何将字符串转换为泛型类型

时间:2014-03-05 11:50:00

标签: c# generics

我有一个方法,其签名看起来像这样:

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<?>();
}

什么取代了问号?

3 个答案:

答案 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)

看起来你应该改变你的方法 您应该将GetReferenceDataGetReferenceDataNoCache重写为非通用方法,而不是从非通用方法中调用泛型方法:

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);
}

查看您的代码:TGetReferenceData<T>的唯一好处是typeof(T)
事实上,其余方法都是非通用的。

答案 2 :(得分:0)