Переменная salary
- это просто копия значения из data
. Вы должны изменить исходный список вместо копии. Функция enumerate
может генерировать индекс (от 0), необходимый для изменения значения внутри списка.
data = [['Ben', 'Manager', 3000],
['James', 'Cleaner', 1000],
['Ken', 'Supervisor', 2000]]
for i, (name, appt, salary) in enumerate(data):
if name == 'James':
data[i][2] = 1500
print(data[i])
Выход: ['James', 'Cleaner', 1500]
Проведя дальнейшее исследование, я пришел к выводу, что моя проблема в том, что моя внешняя библиотека не связана должным образом с зависимостями mono.net. Вот почему, когда вы создаете приложение Blazor, оно компилируется во второй раз в /dist/_framework/_bin.
Я нашел три возможных решения этой проблемы:
Таким образом, ваше приложение будет автоматически преобразовано в моно -совместимая сборка при сборке. Простой взгляд на Blazor .csproj показывает зависимости, необходимые для достижения этой цели. Чтобы это работало, мне пришлось изменить .csproj моей внешней сборки:
из стандартной библиотеки нестандартных файлов:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
в веб-приложение:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RunCommand>dotnet</RunCommand>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="0.7.0" PrivateAssets="all" />
</ItemGroup>
</Project>
[ 1119] Это единственные необходимые зависимости. При сборке совместимая сборка будет находиться в папке / dist / _framework / _bin. Затем его можно загрузить, используя методы, описанные в вопросе.
Этот работает , но чувствует себя немного хакерским, потому что единственная причина, по которой мы превращаем библиотеку в веб-приложение, состоит в том, что она может скомпилировать себя в правильно связанную сборку.
Другое решение - разархивировать пакет Nuget из Microsoft.AspNetCore.Blazor.Build и взять файл netstandard.dll. Он находится в папке tools\mono\bcl\Facades
. Теперь, когда в основном приложении Blazor выполняется следующее:
var netstandard = await client.GetByteArrayAsync("http://localhost:62633/_framework/netstandard.dll");
var externallib = await client.GetByteArrayAsync("http://localhost:62633/_framework/MyCustomLib.dll");
AppDomain.CurrentDomain.Load(netstandard);
var assembly = AppDomain.CurrentDomain.Load(externallib);
, библиотека немодифицированной netstandard 2.0 MyCustomLib
будет загружена без ошибок.
Инструменты Blazor Build, которые в настоящее время находятся здесь здесь , имеют команду ResolveRuntimeDependenciesCommand
для CLI, которая, кажется, делает именно то, что нужно. веб-приложение Blazor делает, когда оно выводит вывод в / _framework / _bin Я все еще смотрю на то, как это можно использовать для преобразования сборки «non blazor-webapp» в моносовместимую.
Не стесняйтесь комментировать или отвечать с дополнительной информацией. Я оставляю этот вопрос открытым, пока не будет найдено «более чистое» решение.