2015-02-12 5 views
0

У меня есть универсальный метод:Как вывести тип аргумента при вызове общего метода?

public static DataTable ToDataTable<T>(List<T> data) 

И я пытаюсь сделать вызов к нему, выполнив:

var myVar= JsonConvert.DeserializeObject<LeagueFixtures>(url); 
DataTable myDataTable = ToDataTable(myVar); 

Однако я получаю ошибку «Типы аргументов не могут быть выведены из Попробуйте указать аргументы типа конкретно. " в строке, где я вызываю ToDataTable.

Структура класса LeagueFixtures является:

public class Fixtures 
{ 
    public string leagueName { get; set; } 
    public List<LeagueFixtures> fixtures { get; set; }  
} 

public class LeagueFixtures 
{ 
    public string date { get; set; } 
    public int matchday { get; set; } 
    public FixtureResult result { get; set; } 
} 

public class FixtureResult 
{ 
    public int goalsHome { get; set; } 
    public int goalsAway { get; set; } 
} 

Я мог заставить его работать, если я сделал:

var myVar= JsonConvert.DeserializeObject<Fixtures>(url); 
DataTable myDataTable = ToDataTable(myVar.fixtures); 

, но я не мог получить доступ к результату, делая myVar.fixtures. результат, тогда как при переходе непосредственно в LeagueFixtures я могу получить доступ к результату.

+0

Я понял все до последнее предложение. Кроме того, DeserializeObject возвращает T, он не возвращает List , поэтому вы не можете ожидать, что он будет назначен ему. – Euphoric

+0

'ToDataTable' ожидает список, но' myVar' является 'LeagueFixtures'. Параметр типа generic не будет устранять эту проблему. Если вы хотите вызвать 'ToDataTable', вам нужно передать ему список. Я не понимаю твое последнее предложение. В чем проблема с 'myVar.fixtures'? Это похоже на то, что вы хотите. – recursive

+0

LeagueFixtures не является списком , где в качестве Fixtures.fixtures - это список . Вы не можете пройти в LeagueFixtures в качестве аргумента для чего-то желающего List . Что конкретно в ваших данных JSON? –

ответ

3

Ваш ToDataTable принимает список, и вы пытаетесь передать ему объект типа LeagueFixtures (который возвращает метод десериализации). Вы можете создать новый список, чтобы перейти в ToDataTable с MYVAR переменной:

DataTable myDataTable = ToDataTable<LeagueFixtures>(new List<LeagueFixtures>{myVar}); 

Отметим, что <LeagueFixtures> ненужно в этот момент, потому что тип может быть выведен.

Редактировать

Как к вашей проблеме обращающегося myVar.fixtures.result - вы не можете сделать это, потому что myVar.fixtures является List<LeagueFixtures> и вам нужно вызвать .result на объекте в этом списке

+0

Творческий подход! Интересно, действительно ли это сделает то, что нужно. В результате DataTable может иметь только одну строку. – recursive

+0

@timvinc код работал, но при попытке получить доступ к результату вы сказали, что мне нужно вызвать .result для объекта в этом списке.Что именно вы подразумеваете под этим? Вы имели в виду что-то вроде var results = myVar.result; – Nate

+0

Если вы deserialize myVar как Fixture, вызывающий myVar.fixtures даст вам список , вы не можете называть '.result' во всем списке – timvinc

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