小编Pav*_*ski的帖子

Autofac 解析具有不同参数的同一类实例

我有一个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 有点陌生,我什至不确定这是否是正确的方法,我认为这与我注册两次有关,我不确定。

强烈感谢任何建议或帮助。

c# dependency-injection autofac xamarin

5
推荐指数
1
解决办法
3336
查看次数

如何在 nunit 测试用例中使用元组?

我尝试使用元组指定 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)

如果这是可能的,我错过了什么?

c# nunit valuetuple

5
推荐指数
1
解决办法
3028
查看次数

避免对具有可为空类型/字段的泛型发出警告的最佳方法?

考虑以下人为的类:

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)

c# c#-8.0 nullable-reference-types

4
推荐指数
1
解决办法
802
查看次数

System.Text.Json 从 API 调用反序列化嵌套对象 - 数据包装在父 JSON 属性中

我有一个 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)

.net c# json .net-core system.text.json

4
推荐指数
1
解决办法
6695
查看次数

可空引用类型和 ToString() 重载

请注意,这个问题是关于最新的 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 …

c# .net-core c#-8.0 nullable-reference-types

4
推荐指数
1
解决办法
486
查看次数

我想获得相同长度的字符串的第一个和第二个字母对(通过使用 LINQ)

我有 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: GJAS: 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)

但是,而不是使用1QAS使用a[0], …

c# linq string list

4
推荐指数
2
解决办法
117
查看次数

C# 将 foreach 循环格式化为 Lambda

我开始使用 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)

c# linq lambda

4
推荐指数
1
解决办法
191
查看次数

为什么返回 Task.CompletedTask 无法在异步方法中编译?

我使用 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)要求?

多谢。

c# asynchronous task async-await

4
推荐指数
2
解决办法
3064
查看次数

可空引用类型:“Try”方法模式,返回 false 时收到 null 警告

我有以下使用“尝试”模式的方法。

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 要点

c# compiler-warnings c#-8.0 nullable-reference-types

4
推荐指数
1
解决办法
1925
查看次数

如何将可为空的对象引用分配给不可为空的变量?

我正在使用 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)

如何修复我的代码以使其编译?非常感谢。

c# .net-assembly c#-8.0 nullable-reference-types

3
推荐指数
2
解决办法
893
查看次数