2011-08-14 5 views
-3

私は↓文字列[]をTに変換するにはどうすればよいですか?

string[] ret = GetItemSample<string[]>(); 

のようなメソッドを呼び出すエラーがあります↓

static T GetItemSample<T>() where T : new() 
    { 
     if (T is string[]) 
     { 
      string[] values = new string[] { "col1" , "col2" , "col3"}; 
      Type elementType = typeof(string); 
      Array array = Array.CreateInstance(elementType, values.Length); 
      values.CopyTo(array, 0); 
      T obj = (T)(object)array; 
      return obj; 
     } 
     else 
     { 
      return new T(); 
     } 
  } 

以下のように私はこの方法を持っているが、誰がどのようにparamは文字列であるときにメソッドを使用する私に言ったことができです[ ]?

thks。

答えて

4

最初のエラー('T' is a 'type parameter' but is used like a 'variable')は、T is string[]は機能しません。 typeof(string[])==typeof(T)

第2のエラー('string[]' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'UserQuery.GetItemSample<T>()')は、string[]にデフォルトのコンストラクタはありませんが、ジェネリック制約ではそれが必要であるということです。

static T GetItemSample<T>() 
    { 
     if (typeof(string[])==typeof(T)) 
     { 
      string[] values = new string[] { "col1" , "col2" , "col3"}; 
      Type elementType = typeof(string); 
      Array array = Array.CreateInstance(elementType, values.Length); 
      values.CopyTo(array, 0); 
      T obj = (T)(object)array; 
      return obj; 
     } 
     else 
     { 
      return Activator.CreateInstance<T>(); 
     } 
  } 

このコードの欠点は、Tにはデフォルトコンストラクタの代わりに、コンパイル時には持っていない場合、それは実行時にエラーがスローされていることです。

1

はあなたの方法は

static T GetItemSample<T>(T[] obj) 

または

static T GetItemSample<T>(T obj) 
のようにする必要があります
関連する問題