【问题标题】:How to convert a string to generic Type如何将字符串转换为通用类型
【发布时间】:2014-03-05 11:50:00
【问题描述】:

我有一个方法,其签名如下所示:

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

问号用什么代替?

【问题讨论】:

  • 如果你需要这个方法,那可能有问题。
  • @TimSchmelter 这不是问题所在。他已经有了类型。他想得到一个基于可变类型参数的完全解析的泛型方法
  • 你能发帖GetReferenceData&lt;T&gt;body 吗?
  • @TimSchmelter 请求来自 SOA Web 服务。它不能传递内部类型。它实际上是在传递一个枚举。我只是简化了代码以使其成为一个字符串,这样我就不需要开始发布枚举了。

标签: c# generics


【解决方案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&lt;T&gt; 没有实现 IList,因此转换可能会失败。

【讨论】:

  • 可能是通用调用无法检测到默认参数,试试我更新的答案。
【解决方案2】:

看起来你应该改变你的方法。
而不是从非泛型替代调用泛型方法,你的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&lt;T&gt; 中的唯一好处是typeof(T)
其余的方法实际上是非泛型的。

【讨论】:

  • 虽然您说得很好,但我有超过 50 个基础参考表要处理。泛型可以节省大量代码。
  • 表的数量与方法结构有什么关系?
  • 对不起,我误解了你的回答。我以为你是在暗示我需要 50 多个单独的 GetReferenceData(TypeX typeX... 声明。
  • @Junto:当然,不。我的意思是,您正试图从非泛型方法中调用泛型方法。这是有道理的,如果通用方法确实做了一些通用的东西。但是您的GetReferenceData 实际上只使用它的类型参数来检索Type 实例。方法的其余部分不依赖于类型参数,可以重写为非泛型。
【解决方案3】:
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 2022-08-18
  • 2019-09-10
  • 1970-01-01
  • 2019-01-21
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多