Невозможно добавить методы в коллекцию с помощью свободного интерфейса.C#

Место общения программистов C#
Ответить
Гость
 Невозможно добавить методы в коллекцию с помощью свободного интерфейса.

Сообщение Гость »


Теперь я действительно застрял после двух дней поиска в Google и попыток всего.

У меня есть файл JSON с массивом записей. Все записи одинаковы, каждая содержит семь свойств (я сам создал JSON, поэтому у меня есть полный контроль над ним). Я хочу наследовать тип коллекции, чтобы добавить некоторые навороты к данным, полученным из JSON. Например, каждая запись (это описание таблицы перевода Брайля — не беспокойтесь, если вы не понимаете, о чем я говорю) имеет

Код: Выделить всё

Language
field, so I would like to do something like that:

Код: Выделить всё

var germanTables = new TableCollection()
.PopulateFromJson()
.FindByLanguage("de");
Here's what I have currently.
The Record

Код: Выделить всё

public readonly record struct TranslationTable(
string FileName,
string DisplayName,
string Language,
string TableType,
string ContractionType,
string Direction,
int DotsMode
) {
// Some helper methods
}
The Collection Class

Код: Выделить всё

public class TableCollection: ICollection {
private const string TablesJson = @"LibLouis\tables.json";
private List tables = new List();

public int Count { get; }
public bool IsReadOnly { get; }

public TableCollection PopulateFromJson() {
using var file = File.OpenRead(TablesJson);
this.tables = JsonSerializer.Deserialize(file);
return this;
}

public TableCollection FindByLanguage(string Language) {
// NOTE! At this stage this.tables.Count returns 1, it finds a German table
this.tables = this.tables.FindAll((TranslationTable table) => table.Language == Language).ToList();
return this;
}

public void Add(TranslationTable item) => ((ICollection)tables).Add(item);
public void Clear() => ((ICollection)tables).Clear();
public bool Contains(TranslationTable item) => ((ICollection)tables).Contains(item);
public void CopyTo(TranslationTable[] array, int arrayIndex) => ((ICollection)tables).CopyTo(array, arrayIndex);
public bool Remove(TranslationTable item) => ((ICollection)tables).Remove(item);
public IEnumerator GetEnumerator() => ((IEnumerable)tables).GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)tables).GetEnumerator();
}
so it does find the table where I commented (after the

Код: Выделить всё

FindAll()
call), but when I invoke it in the code, it returns 0:

Код: Выделить всё

var tables = new TableCollection().PopulateFromJson().FindByLanguage("de");
// It's a Serilog-powered logger, it writes to file
Log.Debug(tables.Count.ToString());
Disclaimer: I spent so much time on it that I might be super stupid and miss something mega obvious, please bear with me. Another thing: if my solution is suboptimal or naïve at all, I'm all ears if you suggest something else.


Источник: https://stackoverflow.com/questions/781 ... -interface
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»