do tnet Core - необходимо создать обобщенный метод расширения c, который имеет два обобщенных и один является расширением - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь создать универсальный c метод преобразования CSV-данных c. У него есть сущность - расширение. Пусть это будет "T", однако мне также нужно включить другой контекст, основанный на сущности. Есть две базы данных, каждая из которых имеет сущность пригорода и контекст БД.

Как у меня есть две обобщенные c переменные, так сказать, одна из которых является расширением ... Это то, с чего я начал:

    public static Suburb FromCsv(string csvLine, CATALOGContext context)
    {
        if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
        if (context == null) throw new ArgumentNullException(nameof(context));

        var values = csvLine.Split(',');
        if (context.States == null) return null;
        if (values.Length <= 3) return null;
        var suburb = new Suburb
        {
            PostCode = values[0],
            SuburbName = values[1],
            State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
            Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
            Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
        };

        return suburb;
    }

Это то, что у меня было, но оно явно не правильно.

        public static T FromCsv<T, I>(this T source, string csvLine, I context)
        {
            if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
            if (context == null) throw new ArgumentNullException(nameof(context));

            var values = csvLine.Split(',');
            if (context.States == null) return null;
            if (values.Length <= 3) return null;
            var suburb = new Suburb
            {
                PostCode = values[0],
                SuburbName = values[1],
                State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
                Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
                Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
            };

            return suburb;
        }

Он не знает, что это dbContext (контекст), поэтому мне нужно использовать предложение where, и я не уверен как это сделать. Кроме того, у каждого dbContext есть «Состояние», но это является ошибкой по вышеуказанной причине - он не знает своего контекста.

Как я могу иметь несколько обобщенных типов, один из которых является расширением - сущность, а другой - существом контекст (даже не уверен, что я могу иметь это), где вы можете использовать его с различными контекстами базы данных и т. д. c?

1 Ответ

2 голосов
/ 24 января 2020

Вы не можете использовать указанную c сущность для возврата T. Вы должны использовать T для возврата T. Почему бы не использовать эту простую?

public enum DBcon
{
      DB1, DB2
}
public static Suburb FromCsv(string csvLine, DBcon con)
{
    var context = con == DBcon.DB1 ? new CATALOGContext() : new DB2Context();

    if (csvLine == null) throw new ArgumentNullException(nameof(csvLine));
    if (context == null) throw new ArgumentNullException(nameof(context));

    var values = csvLine.Split(',');
    if (context.States == null) return null;
    if (values.Length <= 3) return null;
    var suburb = new Suburb
    {
        PostCode = values[0],
        SuburbName = values[1],
        State = context.States.FirstOrDefault(s => s.StateShortName == values[2]),
        Latitude = Convert.ToDouble(values[3], CultureInfo.CurrentCulture),
        Longitude = Convert.ToDouble(values[4], CultureInfo.CurrentCulture)
    };

    return suburb;
}
...