簡體   English   中英

使用 Source Generators 時如何獲取 TypeConverter

[英]How to get TypeConverter when using Source Generators

我可以使用屬性在我的代碼中顯式設置所有類型轉換器,但是在使用 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;
    }

只需做框架所做的事情:

return new TypeConverter();

我發現我需要提供完全限定的類型字符串

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM