2017-02-03 13 views
0

私は2つの汎用関数を持っています。最初のものでは、辞書を埋めて、次の汎用関数を呼び出して辞書をオブジェクトに変換します。汎用関数から動的オブジェクトを返す方法 - エラー

ここでは、特定のオブジェクトに指定するのではなく、T汎用オブジェクトに戻す必要があります。私はこれを達成することができません。これは、エラーを示しています

The type T must be a reference type in order to use it as a parameter "T" in the generic method or type..

public T Fill<T>() 
{ 
    Dictionary<string,string> d = new Dictionary<string,string>(); 
    //filled dictionary ----- 
    SomeClass dObject = ToObject<SomeClass>(d); 

    //[---Here I need to return a dynamic object rather than fixing to SomeClass--] 
    T dObject = ToObject<T>d); ///* Not able to acheive this */// 

    return (T)Convert.ChangeType(dObject, typeof(T)); 
} 

private T ToObject<T>(IDictionary<string, string> dict) 
    where T : class,new() 
{ 
    T t = new T(); 
    PropertyInfo[] properties = t.GetType().GetProperties(); 
    //--- code to convert object to dictionary   
    return t; 
} 
+0

'Fill 'メソッドに 'class'と' new() '制約を追加して、' ToObject '関数と一致するようにする必要があります。 – DavidG

+0

私は今それを追加しましたpublic T Fill ()T:class、new()でも同じエラーです –

+0

いいえ、 'dObject'が2度宣言されたので、違うエラーになりました。 – DavidG

答えて

1

ToObject方法がclassnew()で拘束されているので、あなたもあなたのFill方法にそれと一致する必要があります。

public T Fill<T>() where class, new() 

しかし、あなたが好きならば、あなたはそれを削除することができますのでclass制約する必要があるように表示されません。

あなたは Tclassでなければならないという制約があり、それはパラメータなしのコンストラクタ( new)持っている必要がありますこのコード行で
0

public T Fill<T>() 
:あなたの Fillメソッドのシグネチャは、このようなものです

private T ToObject<T>(IDictionary<string, string> dict) 
    where T : class,new() 

パラメータがないコンストラクタを持たない型でも、structまたはそれ以外の型を渡すことができる制約はありません。このため、エラーが発生しています。同じ制約を定義するか、ToObject<T>メソッドで定義した制約よりも具体的なものを定義する必要があります。あなたの問題を解決するには、単純に次の操作を行います。私は唯一のパラメータなしのコンストラクタを持つクラスでそれを呼び出すことができるように

public T Fill<T>() where class, new() 

Fill<T>は同じ制約があります。

+0

それについて申し訳ありません..どのように動作するのか分からなかった。私は答えを削除しました –

+0

私たちの最善を尽くす;) – CodingYoshi

関連する問題