如何转换类型在视觉上体面,视觉工作室风格的字符串

本文关键字:视觉 体面 工作室 风格 字符串 视觉上 何转换 转换 类型 | 更新日期: 2023-09-27 18:00:19

我编写了一个反射工具来分析数据模型的接口层次结构。

在我的自定义类中,我有一个List<Type>,它包含了我想要显示的所有属性。我写了一个PropertyWrapper类,让我更容易很好地显示这些特定的属性:

public class PropertyWrapper
{
    public PropertyInfo PropertyInfo { get; set; }
    public string PropertyType { get; set; }
    public string PropertyName { get; set; }
    public PropertyWrapper(PropertyInfo propertyInfo)
    {
        PropertyInfo = propertyInfo;
        if (propertyInfo != null)
        {
            PropertyNameString = propertyInfo.Name;
            if (propertyInfo.PropertyType.IsGenericType)
                PropertyTypeString = propertyInfo.PropertyType.FullName.Split('`').First().Split('.').Last()
                                     + "<"
                                     + propertyInfo.PropertyType.GenericTypeArguments.First()
                                                   .FullName.Split('.')
                                                   .Last()
                                     + ">";
            else
                PropertyTypeString = propertyInfo.PropertyType.FullName.Split('.').Last();
        }
    }
}

我的Xaml是这样的:

<DataTemplate DataType="PropertyWrapper">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding PropertyType}" FontWeight="Bold" />
        <TextBlock Text="{Binding PropertyName}" Margin="5 0 0 0" />
    </StackPanel>
</DataTemplate>

我的目标是能够以类似VisualStudio的样式显示某些属性。问题不在于属性名称,更可能是PropertyType,它实际上看起来像(.ToString()):System.Collections.Generic.IList'1[System.Object]。但我想要的是这样一个字符串:IList<Object>(实际上是IList<object>,但我们不要太完美主义)。

我的问题是,由于我经常执行这些代码,是否有更高效/更优雅的方法来实现这一点?我在想,如果我们的代码库变得越来越大,这个反射代码可能不会缩放。

我也很高兴有人批评这个反思代码,因为我对反思还很陌生。它在哪里会失败,我在哪里可以写更安全的代码?不过,它不是生产代码,只是开发人员的一个工具。

关于这段代码,有一点需要说明,这反映了,没有任何带有多个泛型参数的泛型类型

编辑

关于stackoverflow代码块格式化的一个小问题。我能以某种方式转义内联代码块中的"`"字符吗?它不是作为代码块初始值设定项使用,而是作为文本中的一个普通字符,它几乎打乱了我的格式。

如何转换类型在视觉上体面,视觉工作室风格的字符串

我不会太关心"字符串处理"的速度。

反射操作要慢得多,所以请关注如何减少该时间。

你可以使用2种方法:

1) 使用仅反射组件使用加载(更快:

Assembly.ReflectionOnlyLoad()
Assembly.ReflectionOnlyLoadFrom()

2) 使用程序集唯一签名缓存结果,并将结果保存到文件中(即使用序列化),因此不需要重新加载已解析的程序集。

希望这能帮助