Как проверить на наличие наследования интерфейса при прохождении списка?C#

Место общения программистов C#
Ответить
Anonymous
 Как проверить на наличие наследования интерфейса при прохождении списка?

Сообщение Anonymous »

У меня есть приложение на стороне сервера Blazor, где я использую DynamicComponent на странице для создания и добавления компонентов во время выполнения. Для этого у меня есть следующее: < /p>
Набор интерфейсов: < /p>

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

public interface IGetData
{
Task GetDataAsync(string condition);
}

public interface IGetDataA : IGetData
{
Task GetDataAsync(CriteriaA criteria);
}

public interface IGetDataB : IGetData
{
Task GetDataAsync(CriteriaB criteria);
}
< /code>
, а затем на странице (после создания компонентов): < /p>
public async Task RefreshAsync()
{
var itemsA = items.Where(x => x.Ref.Instance is IGetDataA)
.Select(x => x.Ref.Instance)
.Cast();

await Parallel.ForEachAsync(itemsA, async (item, token) =>
{
await item.GetDataAsync(criteriaA);
});

var itemsB = items.Where(x => x.Ref.Instance is IGetDataB)
.Select(x => x.Ref.Instance)
.Cast();

await Parallel.ForEachAsync(itemsB, async (item, token) =>
{
await item.GetDataAsync(criteriaB);
});
}
Можно ли объединить вышеперечисленное на один актер и один цикл? Я упростил интерфейсы следующим образом: < /p>

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

public interface IGetData
{
Task GetDataAsync(string condition);
Task GetDataAsync(T data);
}
< /code>
и код: < /p>
bool IsGetData(object o) => o.GetType().GetInterfaces().Any(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IGetData));

var list = items.Where(x => IsGetData(x.Ref.Instance))
.Select(x => x.Ref.Instance);

await Parallel.ForEachAsync(list, async (item, token) =>
{
if (item is ItemA)
await (item as ItemA).GetDataAsync(criteriaA);
else if (item is ItemB)
await (item as ItemB).GetDataAsync(criteriaB);
});
Теперь у меня есть дополнительный вспомогательный метод, а также мне нужно использовать и как . Есть ли способ дальнейшего упрощения кода?

Подробнее здесь: https://stackoverflow.com/questions/796 ... ugh-a-list
Ответить

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

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

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

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

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