我真的很喜欢 C#8 中接口默认实现的想法。但尝试之后却大失所望……
所以这是一个简单的例子,我在 C#8 接口中找到了部分答案,其中定义了属性/方法 - 显然已经不起作用,原因是:
public interface IHasFirstNames
{
string? FirstName => FirstNames.FirstOrDefault();
List<string> FirstNames { get; }
}
public class Monster : IHasFirstNames
{
public List<string> FirstNames { get; } = new();
public Monster(params string[] firstNames)
{
FirstNames.AddRange(firstNames);
}
}
public static class Program
{
public static void Main()
{
var sally = new Monster("James", "Patrick");
var error = sally.FirstName; // Cannot resolve symbol FirstName
var works = ((IHasFirstNames)sally).FirstName;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你总是不得不把它改得丑陋,那么在接口中拥有属性的默认实现有什么意义呢?
所以根据上面的铸造解决方案我尝试过:
public …
Run Code Online (Sandbox Code Playgroud) 我听说在Java 8中可以灵活地在接口中使用函数定义.我认为我们可以在实现此类接口的所有类中具有此功能的默认状态.
那么,我的问题是我们今天在C#中有这样的功能吗?微软是否有这方面的计划?
请考虑以下代码示例:
public interface IPlayer
{
int Attack(int amount);
}
public interface IPowerPlayer: IPlayer
{
int IPlayer.Attack(int amount)
{
return amount + 50;
}
}
public interface ILimitedPlayer: IPlayer
{
new int Attack(int amount)
{
return amount + 10;
}
}
public class Player : IPowerPlayer, ILimitedPlayer
{
}
Run Code Online (Sandbox Code Playgroud)
我的问题在于代码:
IPlayer player = new Player();
Console.WriteLine(player.Attack(5)); // Output 55, --> im not sure from this output. I can compile the code but not execute it!
IPowerPlayer powerPlayer = new Player();
Console.WriteLine(powerPlayer.Attack(5)); …
Run Code Online (Sandbox Code Playgroud) 我已经读了一段时间了,只是尝试实现它。但是,尽管我可以跨度工作,但是我无法弄清楚如何像示例中那样使流接受它。其他示例也显示了int.parse支持范围,但我找不到使之成为可能的重载或扩展。
我在.net Standard 2.0和.net core 2.0中都尝试过。
请指出正确的方向以使其正常工作。
编辑:代码示例将是:
Span<Byte> buffer = new Span<byte>();
int bytesRead = stream.Read(buffer);
Run Code Online (Sandbox Code Playgroud) 我在启动时有这个:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSwaggerWithUi();
app.UseAuthentication();
app.UseMiddleware<SomeMiddleware>();
app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)
在用户通过身份验证后,我需要添加一些其他声明,但是中间件Invoke函数总是在Auth(HttpContext.User.Identity.IsAuthenticated为false)之前触发。但是,当它击中控制器时,用户便可以通过身份验证。
知道在这里做什么吗?我试图在调用后放入“ app.UseAuthentication()”,app.UseMiddleware
但它没有任何影响。
我目前正在使用多种身份验证方案。我不确定这是否有影响。
我使用 TargetFramework .NET 5.0 (NET Core) 在 VS 2019 中创建了一个解决方案(包含 1 个项目)。我将 OutputPath(在项目属性中)设置为“bin\SomeMyFolder”,并期望所有输出文件都在那里。但事实证明,文件夹“ SomeMyFolde r”内部有另一个文件夹“ net5.0 ”,我的文件就在里面。我从来没有见过这样的自定义文件夹,是由 VS 以前使用其他 .Net Framework 版本创建的。有没有办法禁止 VS 2019 创建该文件夹并在我设置的该文件夹中构建我的项目(直接进入SomeMyFolder)?PS:请不要建议有关构建后事件的一些脚本,例如“copy SomeMyFolder\net5.0 -> SomeMyFolder | rmdir SomeMyFolder'
我正在使用SerialPort与条形码阅读器进行通信(只读).
我已经安装了驱动程序来操作阅读器,就好像它是通过Com-port连接的,虽然它是一个usb设备.插入设备后,列表中会再出现一个Com-port.
问题如下.我初始化SerialPort对象以从条形码阅读器读取,但如果读取器被拔掉,我无法正确完成或处置SerialPort对象,因为它"附加"的端口不再存在.
程序关闭时,结果是WinIOException.我不仅在使用SerialPort的代码中捕获它,而且在program.cs级别也是如此.根据堆栈,在尝试完成和处理SerialPort对象后抛出WinIOException.
我有什么想法可以正确操作这种情况吗?或者至少要抓住异常?
我确切知道的是问题不在于这个特定的驱动程序; 我还有一个来自其他制造商的条形码阅读器(具有相同目的的驱动程序) - 情况是一样的.
尝试将.tsv文件批量插入sql-server-linux docker镜像时,是否遇到此错误:
Referenced external data source "(null)" not found.
这是命令,表存在,文件存在于服务器上:
BULK INSERT countries FROM '/import/file.tsv'
WITH (
FIELDTERMINATOR = '\t'
);
Run Code Online (Sandbox Code Playgroud)
谢谢托马斯
每个人。我一直在尝试使用 EntityFrameworkCore 开发简单的启动 AspNetCore 应用程序,以连接和使用 MS SQL 服务器数据库。并通过 Rider IDE、数据库客户端工具 (DBeaver) 和 dotnet 命令行界面 (dotnet ef) 管理所有这些。我正在使用数据库优先方法(在 mssql 服务器上创建数据库,用表填充它,然后基于表构建模型)。我的逐步行动:
1)为我在 Ubuntu 18.04 上工作的机器安装和设置 mssql 服务器。安装命令行工具“SQLCMD”。/// 指南链接 - https://docs.microsoft.com/en-gb/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
2)本地连接到我的 MSSQLServer 实例。 sqlcmd -S localhost -U SA -P 'MyPasswd'
3) 使用 Transact-SQL 创建的数据库并安装 DB 客户端 (DBeaver) 来快速管理我现在和将来的数据库。
下一步,正如我所想的那样,是使用有关将我的 Web 应用程序连接到此处找到的数据库的教程https://blog.jetbrains.com/dotnet/2017/08/09/running-entity-framework-core-commands-骑手/和这里https://www.entityframeworktutorial.net/efcore/create-model-for-existing-database-in-ef-core.aspx
我的 ASP.NET Core 项目的包引用:
在输入 CLI 命令 dotnet ef dbcontext scaffold "Server=localhost;Database=WebAppDB;Integrated Security=true;" 后 Microsoft.EntityFrameworkCore.SqlServer -c RsvpContext(构建“RsvpContext”上下文以连接到我的数据库 WebAppDB。)
我看到我看到的:
Build started...
Build succeeded.
Microsoft.Data.SqlClient.SqlException …
Run Code Online (Sandbox Code Playgroud) 我目前想知道是否可以通过使用 JPA 存储库内的默认接口方法来优雅地解决特定用例。
假设我们有以下实体和支持类型:
public enum Status {
STATUS_1,
STATUS_2,
STATUS_3
}
@Entity
@Getter // from lombok
@Setter // from lombok
public class SomeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "status")
private Status status;
}
Run Code Online (Sandbox Code Playgroud)
我需要能够查询SomeEntity
基于Status
枚举值组合的列表。
使用 Spring JPA,其各自的存储库可能如下所示:
@Repository
public interface SomeRepository extends JpaRepository<SomeEntity, Integer> {
@Query("select s.id, ... from SomeEntity s where s.status in (:statuses)")
List<SomeEntity> getByStatuses(@Param("statuses") List<Status> statuses);
}
Run Code Online (Sandbox Code Playgroud)
然而,必须传递的特定状态组合在很大程度上取决于 的域SomeEntity
,并且我想在存储库调用中“烘焙”这些状态。为什么在存储库中——当前多个服务使用同一个存储库,并且SomeEntity
作为处理根据服务的具体情况一起更新的其他实体的事务的一部分进行更新。所有服务的特定getByStatuses
调用都是相同的,并且我们有重复的代码片段,大致如下所示:
List<Status> statuses …
Run Code Online (Sandbox Code Playgroud) c# ×7
c#-8.0 ×2
java ×2
.net ×1
.net-5 ×1
.net-core ×1
asp.net-core ×1
asp.net-mvc ×1
bulkinsert ×1
docker ×1
ef-core-3.0 ×1
interface ×1
kerberos ×1
linux ×1
serial-port ×1
spring ×1
sql-server ×1
ubuntu ×1
usb ×1