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>

私の質問は、私はこのコードを頻繁に実行するため、これを達成するためのより効率的でエレガントな方法はありますか? 私たちのコードベースがますます大きくなると、このリフレクション コードはスケーリングされない可能性があると考えていました。

私はリフレクションにかなり慣れていないので、このリフレクション コードに関する批評家にも喜んでいます。どこで失敗する可能性があり、どこでより安全なコードを記述できるでしょうか? ただし、これは製品コードではなく、開発者向けの単なるツールです。

反映されているコードについて 1 つのポイントは、その中に複数のジェネリック引数を持つジェネリック型がないことです。

編集

stackoverflow コード ブロックの書式設定に関するちょっとした質問です。インラインコードブロックの「`」文字をどうにかしてエスケープできますか? コードブロックの初期化子としてではなく、テキストの通常の文字として使用すると、書式設定がほとんど台無しになりました。

4

1 に答える 1

1

「文字列処理」の速度についてはあまり気にしません。

リフレクション操作は非常に遅いため、その時間を短縮する方法に注目してください。

2 つのアプローチを使用できます。

1) リフレクションのみのアセンブリ使用ローディングを使用します (より高速です:

Assembly.ReflectionOnlyLoad()
Assembly.ReflectionOnlyLoadFrom()

2) アセンブリの一意の署名を使用して結果をキャッシュし、結果をファイルに保存します (つまり、シリアル化を使用)。これにより、既に解析されたアセンブリを再読み込みする必要がなくなります。

お役に立てれば

于 2013-02-20T13:18:56.253 に答える