我有一个Xamarin.Forms应用程序,其中使用 Autofac 进行 DI。
所以我想要的很简单,但我无法做一些看起来很容易做的事情。
所以我有一个类,它有两个构造函数,它们都有一个参数,并且根据某些条件我想解析其中一个。举个例子,我有一个类 A,我想要的是基于条件 B 或 C 应该得到解决。
例如:
public class A
{
public A(B bObject)
{...}
public A(C cObject)
{...}
}
Run Code Online (Sandbox Code Playgroud)
但我无法理解如何做到这一点。我尝试做如下的事情:
登记:
builder.RegisterType<A>().
UsingConstructor(typeof(C)).
Named<A>(nameof(C));
builder.RegisterType<A>().
UsingConstructor(typeof(B)).
Named<A>(nameof(B));
Run Code Online (Sandbox Code Playgroud)
解决:
DiContainer.ResolveNamed<A>(nameof(B));
DiContainer.ResolveNamed<A>(nameof(C));
Run Code Online (Sandbox Code Playgroud)
注:我已经在容器中注册了B和C,如下图:
builder.RegisterType<B>();
builder.RegisterType<C>()
Run Code Online (Sandbox Code Playgroud)
我对 AutoFac 有点陌生,我什至不确定这是否是正确的方法,我认为这与我注册两次有关,我不确定。
强烈感谢任何建议或帮助。
我尝试使用元组指定 nUnit 测试用例,但在 VisualStudio 中收到编译器错误。
这个简单的例子演示了我正在尝试做的事情:
[TestCase((1, 2), (3, 5))]
public void TestRangeOverlaps((int start, int end) firstRange, (int start, int end) secondRange)
{
}
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,我错过了什么?
考虑以下人为的类:
public sealed class Test<T>
{
public void SetItem(T item)
{
_item = item;
}
public T GetItem()
{
return _item;
}
T _item; // warning CS8618: Non-nullable field '_item' is uninitialized.
} // Consider declaring the field as nullable.
Run Code Online (Sandbox Code Playgroud)
假设它必须使用以下代码:
var test1 = new Test<int>();
test1.SetItem(1);
Console.WriteLine(test1.GetItem());
var test2 = new Test<string>();
test2.SetItem("One");
Console.WriteLine(test2.GetItem());
Run Code Online (Sandbox Code Playgroud)
进一步假设nullable在编译时启用。
这个实现会产生一个编译器警告(如果像我们一样,你启用了“警告作为错误”,它就会变成一个错误):
警告 CS8618:不可为空的字段“_item”未初始化。考虑将该字段声明为可为空的。
我的问题很简单:
避免此警告的最佳方法是什么?
我尝试过的事情:
1) 将 _item 声明为可空:
T? _item; // Error: A nullable type parameter must be known to …Run Code Online (Sandbox Code Playgroud)
我有一个 API JSON 响应,它将数据内容包装在一个data属性中,如下所示:
{
"data":{
"email":"admin@example.com",
"mobile":"+1555555123",
"id":4,
"first_name":"Merchant",
"last_name":"Vendor",
"role":"Merchant",
}
}
Run Code Online (Sandbox Code Playgroud)
所以使得用户对象的请求时就像一个图书馆RequestSharp,将response.Content有包裹在用户的内容dataJSON属性作为它来自API。代码:
var request = RequestHelper.CreateTokenRequest(email, password); // Create the request from a helper
var client = new RestClient(BaseUrl); // create new RestSharp Client
IRestResponse response = client.Execute(request); // execute the request
var content = response.Content; // raw content as string
Run Code Online (Sandbox Code Playgroud)
这很好,但是当我将 json 反序列化为对象时System.Text.Json,如下所示,将创建User对象但不会分配任何属性,尽管这是预期的,因为序列化程序正在寻找带有first_name和的属性last_name。 .. 不是['data']['first_name']
User account = JsonSerializer.Deserialize<User>(response.Content, …Run Code Online (Sandbox Code Playgroud) 请注意,这个问题是关于最新的 C# 8 nullable-references,我已经csproj通过以下<Nullable>enable</Nullable>声明在文件中启用了它。
考虑下面的简单代码
class SortedList<T> where T : struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
{
private Node? _node;
private readonly IComparer<T> _comparer = Comparer<T>.Default;
class Node
{
public Node(T value)
{
Value = value;
}
public T Value { get; }
public Node? Next { get; set; }
public override string ToString()
{
return Value.ToString();
}
}
//rest of code, that isn't important
}
Run Code Online (Sandbox Code Playgroud)
该行return Value.ToString();给了我一个CS8603 可能的空引用返回警告,我的问题实际上为什么在这里?
我使用where …
我有 2 个字符串列表
List<string> A = new List<string> { "1QWERTY", "ASDF4B2J", "C0QW", "8D" };
List<string> B = new List<string> { "GJ65SJ2", "KO21L94B", "ABF287KF2", "GPK25" };
Run Code Online (Sandbox Code Playgroud)
我想获得相同长度的字符串的第一个和第二个字母对(通过使用 LINQ)。
喜欢1Q: GJ或AS: KO。
所以,我写了这段代码:
var res = A.Join(
B,
a => a.Length,
b => b.Length,
(a, b) => new { str = a[0] + a[1] + ": " + b[0] + b[1] }
);
foreach (var e in res)
{
Console.WriteLine(e.str);
}
Run Code Online (Sandbox Code Playgroud)
但是,而不是使用1Q或AS使用a[0], …
我开始使用 C# 并获得了以下课程:
using System;
using System.Collections.Generic;
class PrefixMapSum : Dictionary<String, int> {
public bool insert(String key, int value) {
return base.TryAdd(key, value);
}
public int sum(String prefix) {
int sum = 0;
foreach (String key in base.Keys) {
if (key.StartsWith(prefix)) {
sum = sum + base[key];
}
}
return sum;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想用 lambda 表达式缩短代码的以下部分:
foreach (String key in base.Keys) {
if (key.StartsWith(prefix)) {
sum = sum + base[key];
}
}
Run Code Online (Sandbox Code Playgroud)
我试过:
new List<String>(base.Keys).ForEach(key => key.StartsWith(prefix) ? sum = …Run Code Online (Sandbox Code Playgroud) 我使用 VS2019 和 dotnetcore 3.1 作为一个简单的控制台应用程序,我有这个代码片段:
public static async Task F()
{
await Task.Delay(1000);
return Task.CompletedTask; // error
}
Run Code Online (Sandbox Code Playgroud)
它无法编译。我只是创建一个 (1) 异步方法,(2) 返回一个任务。为什么这个 return 语句不能编译?如何修复它以满足我的(1)和(2)要求?
多谢。
我有以下使用“尝试”模式的方法。
public bool TryGetValue(string subnet, [NotNullWhen(true)] out TValue value)
{
if (!TryFindNode(subnet, out var node))
throw new InvalidOperationException();
if (TValueIsDefault(node.Value) == false)
{
value = node.Value;
return true;
}
value = default;
return false;
}
Run Code Online (Sandbox Code Playgroud)
在线value = default- 我收到编译器警告 CS8601:“可能的空引用分配”。下一行返回false, 并value具有该[NotNullWhen(true)]属性。
我是否遗漏了某些内容,或者编译器由于某种原因没有携带 的状态value?
Sharplab.io上的完整示例和Github 要点
我正在使用 VS2019 并在项目设置中启用了可为空检查语义。我正在尝试使用程序集获取可执行文件的路径,如下所示:
var assembly = Assembly.GetEntryAssembly();
if (assembly == null)
{
throw new Exception("cannot find exe assembly");
}
var location = new Uri(assembly.GetName().CodeBase);//doesn't compile.
Run Code Online (Sandbox Code Playgroud)
它说,“assembly”是一个 [Assembly?] 类型,而 Uri ctor 需要一个字符串,编译错误是:
error CS8602: Dereference of a possibly null reference.
Run Code Online (Sandbox Code Playgroud)
如何修复我的代码以使其编译?非常感谢。