假设我有一个接口IFoo与实现类VideoFoo,AudioFoo和TextFoo.进一步假设我无法修改任何代码.假设我想编写一个基于运行时类型的函数IFoo,例如
Public Class Bar
Public Shared Sub Fix(ByVal Foo as IFoo)
If TypeOf Foo Is VideoFoo Then DoBar1()
If TypeOf Foo Is AudioFoo Then DoBar2()
If TypeOf Foo Is TextFoo Then DoBar3()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
我想重构这个以使用重载方法:
Sub DoBar(ByVal foo as VideoFoo)
Sub DoBar(ByVal foo as AudioFoo)
Sub DoBar(ByVal foo as TextFoo)
Run Code Online (Sandbox Code Playgroud)
但我认为做这样的事情的唯一方法就是写作
Sub DoBar(ByVal foo as IFoo)
Run Code Online (Sandbox Code Playgroud)
然后我必须再做一次"If TypeOf ...... Is".我怎样才能重构这个以利用实现的多态性IFoo而无需手动检查类型?
(在VB.NET中,虽然我的问题也适用于C#)
我在这里做了一点搜索,我很惊讶没有人问过这个问题.对于多行语句,Visual Studio 2010的VB智能缩进是否会被严重破坏?或者我正在做/设置错误的东西?我把它设置为4个字符的缩进与保持标签.在VB中使用自然返回键入多行语句会产生以下内容(更改属性名称以保护无辜者).
Public Sub Sub1()
Dim foo As New MyClassA With {.FileName = "test",
.Format = MyEnumForImageFormat.jpg,
.IsReallySpecial = False,
.Name = "testN",
.SourceId = Guid.NewGuid(),
.VariantName = "TestV",
.Width = 800,
.Height = 600}
End Sub
Run Code Online (Sandbox Code Playgroud)
怎么会有人想这样格式化他们的代码?我想,也许我需要重新格式化(Ctrl + K Ctrl + D):
Public Sub Sub1()
Dim foo As New ImageBase With {.FileName = "test",
.Format = MyEnumForImageFormat.jpg,
.IsReallySpecial = False,
.Name = "testN",
.SourceId = Guid.NewGuid(),
.VariantName = "TestV",
.Width = 800,
.Height = 600}
End Sub
Run Code Online (Sandbox Code Playgroud)
为了更好的衡量,我再次尝试重新格式化.瞧,它把它推得更远了.我再次推了它,它又动了一些.最后,经过四次重新格式化后,我的代码如下: …
当我在.vue文件中有一个带有数据成员isLoading: false和模板的Vue组件时:
<div v-show="isLoading" id="hey" ref="hey">Loading...</div>
<button @click="loadIt()">Load it</button>
Run Code Online (Sandbox Code Playgroud)
一个方法:
loadIt() {
this.isLoading = true
this.$nextTick(() => {
console.log(this.$refs.hey)
// ...other work here that causes other DOM changes
this.isLoading = false
})
}
Run Code Online (Sandbox Code Playgroud)
(这里的"加载"是指从内存中加载而不是AJAX请求.我想这样做,以便我可以在DOM更改时立即显示一个简单的"加载"指示,可能需要0.2-0.5秒左右正在发生.)
我认为该$nextTick函数将允许虚拟和实际DOM更新.控制台日志读取该项目已"显示"(删除display: none样式).但是,在Chrome和Firefox中,我从未看到"正在加载..."指示器; 发生短暂延迟,并且在没有显示加载指示符的情况下发生其他DOM更改.
如果我使用setTimeout而不是$nextTick,我将看到加载指示器,但仅当其他工作足够慢时.如果有十分之几秒的延迟,则加载指示器永远不会显示.我希望它能立即出现在点击中,以便我可以呈现一个快速的GUI.
在 C# 8.0 中,假设我<Nullable>enable</Nullable>在 .csproj 中启用了可空引用。当我尝试在不可为空的用法中使用可能为空的引用时,这给了我警告,这很好。然后我可以打开<WarningsAsErrors />并将其严格执行为错误而不是警告。
所以我希望这种语言结构可以避免某些空检查代码。具体来说,我(和许多其他人)经常写这样的方法:
public string Message { get; set; }
public void SetFoo(string message) {
Message = message ?? throw new ArgumentNullException(nameof(message));
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
我希望放弃空检查,因为引用是不可为空的,而是写
public string Message { get; set; }
public void SetFoo(string message) {
Message = message;
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
这似乎很好,因为像这样的调用会myThing.SetFoo(null);生成编译器警告/错误。但是,我发现诸如myThing.SetFoo(null!);编译和运行之类的代码无论如何都可以!因此,为了进行防御性编码,无论如何我都需要保留旧的保护条款,以防有人滥用!运算符来调用它,对吗?
有什么方法可以避免编写代码来检查不可为空的引用是否为空? 我希望有一种方法可以让编译器推断它在这种情况下应该抛出异常,而不仅仅是忽略不可为空性,但我没有看到。
我似乎经常根据查询从 JdbcConnectionSource 创建一个 Kafka Connect 连接器,并且连接器创建成功,状态为“RUNNING”,但没有创建任何任务。查看我的容器的控制台日志,我没有看到任何错误的迹象,我可以说:没有错误,没有警告,没有解释任务失败的原因。我可以让其他连接器工作,但有时不能。
当连接器无法创建 RUNNING 任务时,如何获得更多信息以进行故障排除?
我将在下面发布我的连接器配置示例。
我正在使用 Kafka Connect 5.4.1-ccs。
连接器配置(它是 JDBC 背后的 Oracle 数据库):
{
"name": "FiscalYear",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"tasks.max": 1,
"connection.url": "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost.example.com)(PORT=1521))(LOAD_BALANCE=OFF)(FAILOVER=OFF)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MY_DB_PRI)(UR=A)))",
"connection.user":"myuser",
"connection.password":"mypass",
"mode": "timestamp",
"timestamp.column.name": "MAINT_TS",
"topic.prefix": "MyTeam.MyTopicName",
"poll.interval.ms": 5000,
"value.converter" : "org.apache.kafka.connect.json.JsonConverter",
"value.converter.schemas.enable": "false",
"numeric.mapping": "best_fit",
"_comment": "The query is wrapped in `select * from ()` so that JdbcSourceConnector can automatically append a WHERE clause.",
"query": "SELECT * FROM (SELECT fy_nbr, min(fy_strt_dt) fy_strt_dt, max(fy_end_dt) fy_end_dt FROM myuser.fsc_dt fd WHERE …Run Code Online (Sandbox Code Playgroud) 在客户端的 Blazor WebAssembly 应用程序中使用MSAL.NET时,是否有任何方法可以提供域提示(或以其他方式避免需要“选择帐户”提示)?我想这可能是传递给 builder.Services.AddMsalAuthentication 的设置或选项,但我没有看到它。
我为服务器弄清楚了,但还没有为客户端弄清楚。如果无法设置此选项,我在尝试进行身份验证时会收到来自 microsoftonline.com 的多余“选择帐户”提示。
我目前在客户端的 Program.cs 中有:
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add(myScope);
options.UserOptions.RoleClaim = "roles";
});
Run Code Online (Sandbox Code Playgroud) c# azure-active-directory openid-connect azure-ad-msal blazor-webassembly
在普通的 Blazor WebAssembly 网页中,有没有办法在页面上运行 Web 视图?也就是说,要在我的实际浏览器中有效地在我的页面上拥有一个“内部”浏览器,无论是 WebView2 还是其他浏览器?
如果没有特定于 Blazor 的方法来执行此操作,是否有非 Blazor(Javascript 或其他)方法?
我意识到这是一件奇怪的事情,但我想尝试显示来自其他网站的页面,其中 iframe 由于该frame-ancestors 'self'政策而无法工作。我确信这通常是不鼓励的,也是一种不好的做法,但正如我所说,这些只是实验和学习。
请注意,我不是在询问移动设备、WPF、MAUI 或任何其他本机应用程序,只是在实际网页上使用浏览器的用例。
Rails 3问题.我有一份Foods食品表,其中包含以下属性:
然后我有一个LoggedFoods表,表示在给定时间吃过的食物.它具有以下属性:
所以我的问题是我想在一次查询中得到每天(所有日子)消耗的卡路里,脂肪,蛋白质,碳水化合物的总数.我一直在尝试使用新的ActiveRecord查询界面执行此Rails 3并且没有运气.有任何想法吗?
在WCF服务内部调试时,如何查看从LINQ to SQL生成的SQL查询?我以为我可能只是设置dataContext.Log = Console.Out并且SQL将被写入输出/立即窗口.它不是 - 因为我使用IIS托管? Console.WriteLine("Hello")甚至没有写任何东西到输出/立即窗口.
怎么看我的控制台输出?
在 SQL Server (T-SQL) 中,我当然可以 JOIN 到子查询,但我刚刚了解到我也可以 JOIN 到不是子查询的嵌套 JOIN 表达式。例如:
SELECT *
FROM dbo.Customer c
JOIN ( /* note no SELECT */
dbo.Table2 t2
JOIN dbo.Table3 t3 ON t3.t2Id = t2.Id
) ON c.t2Id = t2.Id /* note no alias */
WHERE c.CustomerId = 1234;
Run Code Online (Sandbox Code Playgroud)
这个“没有子查询的嵌套 JOIN”语法叫什么?在 Microsoft 文档中哪里可以找到它?在连接或子查询的上下文中没有提到它。
c# ×2
vb.net ×2
.net ×1
activerecord ×1
apache-kafka ×1
arel ×1
browser ×1
c#-8.0 ×1
cross-site ×1
debugging ×1
group-by ×1
iframe ×1
iis ×1
javascript ×1
join ×1
nested ×1
oop ×1
polymorphism ×1
sql ×1
sql-server ×1
t-sql ×1
vue.js ×1
wcf ×1