2009-03-27 10 views
1

ジェネリックメソッドのジェネリックパラメータのインスタンスが、値型または参照型のいずれかに割り当てられているかどうかをテストする方法はありますか?私はタイプを保持しなければならない一般的な方法でこれを行うことができるようにしたいと思います.Tはインスタンス、Kはそのタイプの識別子フィールドの型です(ベースから継承するので、タイプ)。私はKを価値の種類に制限したくない。 Kは、それが同等であることに依存しているようにエラー(K)の結果をデフォルトに等しいかどうかをチェック値型とすることができるようC#ジェネリック型のテスト割り当て

public static bool Save<T, K>(T instance) 
{ 
    // variable to hold object identifer 
    K instanceId = default(K); 

    PropertyInfo[] properties = typeof(T).GetProperties(); 

    // loop through properties of the T 
    // if property is decorated with a specific attribute then assign to instanceId 
    // end loop 

    // check that we have a value assigned to instanceId other than default(K) 
    // if not return false otherwise continue to persist item 
} 

:コードは次のようなものです。これを回避する方法はありますか?

現在のケースでは、ジェネリック型Tの条件をベース型BaseObjectから継承する必要があるため、ジェネリックとテストの割り当てに関する一般的な問題について質問しています。

答えて

5

instanceIdから読んでいる場合は、コンパイラの観点から確実に割り当てなければなりません。私はdefault(K)でそれを割り当てて、個別にそれが便利値を与えられていますかどうかを示すフラグを持っているでしょう:

public static bool Save<T, K>(T instance) 
{ 
    bool idAssigned = false; 
    // variable to hold object identifer 
    K instanceId = default(K) 

    PropertyInfo[] properties = typeof(T).GetProperties(); 

    foreach(PropertyInfo property in properties) 
    { 
     if (SomeCondition(property)) 
     { 
      instanceId = GetId(property); 
      idAssigned = true; 
     } 
    } 

    if (!idAssigned) 
    { 
     return false; 
    } 
    Persist(whatever); 
    return true; 
} 

EDIT:任意の特定の値を持つinstanceIdの値を比較すると、非スターターです、 instanceIdに明示的に割り当てられた「通常の」値には値が使用されないという事実を知らない限り、

基本的にここには2ビットの情報がありますので、別々に保管してください。フラグを使用する方法です。

+0

私は実際にこのようなことをしています。デフォルト(K)とフラグを割り当てていますが、値がデフォルト(K)以外の値だったかどうかを確認することができます。それが値か参照型かどうかわからない場合は、これを行うことはできません。 –

+0

私はこの問題をデフォルト(K)に等しいかどうかをより明確に反映するように質問を更新しました。 –

関連する問題