【问题标题】:CodeType get generic parametersCodeType 获取泛型参数
【发布时间】:2013-08-06 07:14:21
【问题描述】:

我们正在使用 Visual Studio CodeModel,但在获取 CodeType 的通用参数时遇到了一些问题。如何在不自己解析FullName的情况下获取它们?

How can I get the generic constraints from CodeInterface as a CodeType object? 中暗示(尽管未标记为答案)没有其他方法,但是,这并不可信,因为:

System.Func<Outer.Inner>

不会被定义:你无法知道你解析的泛型参数 (Outer.Inner) 是指包含类 Inner 的命名空间 Outer,还是指的是类 Outer一个内部类Inner(是的,在这种情况下它不是Outer+Inner)。

如果有人至少知道如何告诉 FullName 属性以显示带有 + 符号的嵌套类,那也很棒。

【问题讨论】:

    标签: c# generics envdte


    【解决方案1】:

    我认为answer here 非常明确。 DTE 或 DTE2 不支持此功能,并且将来不太可能支持。

    目前唯一的方法是使用 Roslyn,这对于我们这些不想使用预发布软件的人来说是不可接受的。我也没有研究过需要什么样的依赖(我的组件的用户需要安装 Roslyn 吗?)。

    可以使用正则表达式从 FullName 字符串中获取类型。但是,对于我们这些现实世界中需要令牌 (T) 到具体类型 (System.String) 映射的人来说,这不是一个选择。

    【讨论】:

      【解决方案2】:

      我找不到对任何泛型类型执行此操作的方法,但如果您需要为特定类型执行此操作,在某些情况下是可能的。

      例如,我有以下代码来检查一个类型是否是一个集合,如果是,则获取元素类型:

          private static bool IsCollectionType(CodeType type, out CodeType elementType)
          {
              // string implements IEnumerable<char>, but we don't want to treat it as a collection
              if (type.FullName == "System.String")
              {
                  elementType = null;
                  return false;
              }
      
              var enumerable = type.Bases.OfType<CodeInterface>().FirstOrDefault(i => i.FullName.StartsWith("System.Collections.Generic.IEnumerable<"));
              var method = enumerable?.Members.OfType<CodeFunction>().FirstOrDefault(m => m.Name == "GetEnumerator");
              var enumerator = method?.Type.CodeType;
              var current = enumerator?.Members.OfType<CodeProperty>().FirstOrDefault(m => m.Name == "Current");
              if (current != null)
              {
                  elementType = current.Type.CodeType;
                  return true;
              }
      
              elementType = null;
              return false;
          }
      

      如您所见,我不是直接查看泛型类型参数,而是查看IEnumerable&lt;T&gt;.GetEnumerator().Current 的类型。当然,这需要有关您正在使用的类型的特定知识。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        相关资源
        最近更新 更多