2017-08-29 13 views
7

私はEntity Frameworkのコードファーストモデルを作成しました。このモデルでは、リスト内のすべての項目に対して呼び出される検索メソッドを持つ静的汎用クラスを作成しました。 これは私の頭の中にあると認めて、クラスを静的にするとコードの明瞭さが向上し、多分異なる場所にインスタンスを作成する必要がないためパフォーマンスが向上すると考えました。 このすべての目的は、ユーザーがどのプロパティを検索、エクスポートなどできるか​​を自動化することです。MakeGenericType(...)を複数回呼び出すと、毎回新しい型が作成されますか?

リファレンスタイププロパティを持つすべてのアイテム(潜在的に1000s)にMakeGenericType(...)が呼び出された場合、そのリファレンスタイププロパティのジェネリックタイプは一度生成され、どこかに保存されるか、1000時間?

他のパフォーマンス犯罪やコードの匂いを指摘していただければ幸いです。

public static class SearchUserVisibleProperties<T> 
{ 
    private static List<PropertyInfo> userVisibleProperties { get; set; } 

    static SearchUserVisibleProperties() 
    { 
     userVisibleProperties = typeof(T).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(UserVisibleAttribute))).ToList(); 
    } 

    public static bool search(T item, string searchString) 
    { 
     foreach (PropertyInfo pInfo in userVisibleProperties) 
     { 
      object value = pInfo.GetValue(item); 
      if (value == null) 
      { 
       continue; 
      } 
      if (pInfo.PropertyType == typeof(string) || pInfo.PropertyType.IsValueType) 
      { 
       ...unrelevant string matching code... 
      } 
      else if ((bool)typeof(SearchUserVisibleProperties<>).MakeGenericType(new Type[] { value.GetType() }).InvokeMember(nameof(search), BindingFlags.InvokeMethod, null, null, new object[] { value, searchString })) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
} 
+0

ありがとう!私はいつも新しいタイプが毎回作成されると想定し、これを防ぐために独自のキャッシングレイヤーを追加しました。実際、私は 'False'が2回表示されることを期待して答えのコードを書いていました。今すぐキャッシュ層を安全に削除できることが判明しました。 – dasblinkenlight

+1

'MakeGenericType'の' typeArguments'パラメータは 'params'キーワードで宣言されているので、' new Type [] {value.GetType()} 'は必要ないことに注意してください。どちらの方法でも新しい配列が作成されますが、コードが混乱することはありません。 – dasblinkenlight

+0

'新しいType [] {value.GetType()}'を削除すると 'class SearchUserVisibleProperties 'として 'ArgumentException'がスローされます。だから私のコードの明白なパフォーマンス/においの改善はありませんか?いくつかの時間のためにそれを組み立てた後に少しプライドを感じる:)。答えをありがとう! – Tom

答えて

7

Documentation of MakeGenericType型がジェネリック型定義とジェネリック型引数の同じ組み合わせに対して返さ同じになることを示唆している:

MakeGenericTypeによって返さType物体により得られるTypeと同じです結果の構築された型のGetTypeメソッドを呼び出すか、同じ型引数を使用して同じジェネリック型定義から作成された任意の構築された型のメソッドを呼び出します。ここで

上記が正しいことを示すための小さな実験です:質問には

関連する問題