2017-02-03 3 views
0

У меня есть две общие функции. В первом я заполняю словарь, а затем вызываю следующую общую функцию для преобразования словаря в объект.Как вернуть динамический объект из общей функции - ошибка

Здесь мне нужно вернуться к общему объекту 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

Вам нужно добавить ограничения 'class' и' new() 'в метод' Fill ', чтобы он соответствовал функции 'ToObject '. – DavidG

+0

Я добавил его сейчас - public T Fill (), где T: class, new(), но все равно такая же ошибка –

+0

Нет, теперь у вас другая ошибка, потому что 'dObject' объявляется дважды. – DavidG

ответ

1

Поскольку метод ToObject ограничен с class и new(), вы также должны соответствовать вашему методу Fill.

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

Тем не менее, как представляется, не быть необходимости для class ограничения, так что вы можете удалить его, если вам нравится.

0

В этой строке кода у вас есть ограничение, которое T должно быть class и он должен иметь конструктор без параметров (new): подпись

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

Ваш Fill метода выглядит так:

public T Fill<T>() 

См. Там нет ограничений, что означает, что я могу передать struct или любой другой тип, даже тип, который не имеет конструктора без параметров. Вот почему вы получаете ошибку. Вам нужно определить одно и то же ограничение или что-то более конкретное, чем ограничение, которое вы определили по методу ToObject<T>. Чтобы устранить проблему, просто сделать это:

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

Теперь Fill<T> имеет такое же ограничение, так что я могу назвать его с классом, который имеет конструктор без параметров.

+0

Извините, что .. Не знал, как это работает. Я удалил ответ –

+0

Случается к лучшему из нас;) – CodingYoshi

Смежные вопросы