2010-11-29 3 views
4

XMLから値を取得するヘルパー関数があります。これはint型や文字列型などの値型で正常に動作します。私はまた、彼らのコンストラクタのパラメータとしてのXPathNavigatorを取るいくつかのクラスを持っていると私は、次のような何かをしたいと思います:値と参照型オブジェクトを返すことができる汎用関数

意志はありますが、方法はあり
public static void SelectSingleNodeSafe<T>(XPathNavigator nav, string pos, out T ret, T def) 
    { 
     XPathNavigator node = nav.SelectSingleNode(pos); 
     if (node != null) 
      if (typeof(T).IsSubclassOf(XMLConstructible)) 
       ret = new T(node);// this won't compile 
      else 
       ret = (T)node.ValueAs(typeof(T));//this works for my use cases 
     else 
      ret = def; 
    } 

+3

文字列は値の種類ではありません。 –

+1

問題は '新しいT(ノード)'が不可能だということです。汎用関数は、パラメータ化された型のデフォルトコンストラクタのみを呼び出すことができます。 – Gabe

+0

可能な複製[C#Generic new()コンストラクタの問題](http://stackoverflow.com/questions/840261/c-generic-new-constructor-problem) – Donnie

答えて

6

new Tにはコンパイル時のチェックがいくつかありますが(実行したのは明らかですが)、実行時の情報に基づいています。あなたはtypeof(int).IsSubclassOf(XMLConstructible)が真ではないことを知っていますが、コンパイラはそうではないので、new Tはコンパイルする必要があります。 new Tを使用する代わりに、リフレクションを使用してインスタンスを作成します。簡単な方法は、使用することですActivator.CreateInstance

ret = (T)Activator.CreateInstance(typeof(T), node); // this _will_ compile 
+1

+1いくつかの単体テストに加えて、良いアプローチをすることができます。しかし、パフォーマンス上のオーバーヘッドがありますが、それは重要ではないかもしれません。 –

関連する問題