0

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

在我的自定义类中,我有一个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>

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

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

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

关于代码,要说的一点是,其中没有任何具有多个泛型参数的泛型类型。

编辑

关于stackoverflow代码块格式的一个小问题。我可以以某种方式转义内联代码块中的“`”字符吗?不将其用作代码块初始化程序,而是将其用作文本中的普通字符,它几乎弄乱了我的格式。

4

1 回答 1

1

我不会太在意“字符串处理”的速度。

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

您可以使用 2 种方法:

1)仅使用反射程序集使用加载(它更快:

Assembly.ReflectionOnlyLoad()
Assembly.ReflectionOnlyLoadFrom()

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

希望这可以帮助

于 2013-02-20T13:18:56.253 回答