【问题标题】:How to get TypeConverter when using Source Generators使用 Source Generators 时如何获取 TypeConverter
【发布时间】:2021-01-03 12:13:09
【问题描述】:

我可以使用属性在我的代码中显式设置所有类型转换器,但是在使用 TypeDescriptor.GetConverter 时如何获取隐式类型转换器。

    private static string? GetTypeConverter(Compilation compilation, IPropertySymbol propertySymbol)
    {
        var typeConverterAttribute = compilation.GetTypeByMetadataName("System.ComponentModel.TypeConverterAttribute");
        if (typeConverterAttribute is null)
        {
            return null;
        }

        var propertySymbolTypeConverter = GetTypeConverter(propertySymbol, typeConverterAttribute);
        if (propertySymbolTypeConverter is not null)
        {
            return propertySymbolTypeConverter;
        }
        
        var propertySymbolTypeTypeConverter = GetTypeConverter(propertySymbol.Type, typeConverterAttribute);
        if (propertySymbolTypeTypeConverter is not null)
        {
            return propertySymbolTypeTypeConverter;
        }

        // TODO: This does not work as it uses reflection.
        // var type = Type.GetType(propertySymbol.Type.ToDisplayString());
        // if (type is not null)
        // {
        //     return TypeDescriptor.GetConverter(type).ToString();
        // }
        
        return null;
    }

【问题讨论】:

    标签: c# roslyn sourcegenerators


    【解决方案1】:

    做框架做的事:

    return new TypeConverter();

    【讨论】:

    • 我想要明确的 TypeConverter 类型。
    【解决方案2】:

    我发现我需要提供完全限定的类型字符串

            var format = new SymbolDisplayFormat(
                typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
                genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters | SymbolDisplayGenericsOptions.IncludeTypeConstraints | SymbolDisplayGenericsOptions.IncludeVariance
            );
            var type = Type.GetType(propertySymbol.Type.ToDisplayString(format));
            if (type is not null)
            {
                return TypeDescriptor.GetConverter(type).ToString();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-17
      • 2012-10-07
      • 1970-01-01
      • 2022-06-11
      • 2011-08-22
      • 2011-12-28
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多