C# 静态上下文在设置后为空

C# 静态上下文在设置后为空,c#,.net-core,reflection,nunit,rider,C#,.net Core,Reflection,Nunit,Rider,此.NETCore3.1(NUnit3)测试在VisualStudio2019下工作 但是一旦我使用JetBrains Rider,测试就失败了,因为静态属性(DataA)在大多数情况下都返回null 你知道哪里出了问题以及如何解决这个问题吗 public static class ClassA { public static string DataA { get; set; } public static string DataB { get; set; }

此.NETCore3.1(NUnit3)测试在VisualStudio2019下工作

但是一旦我使用JetBrains Rider,测试就失败了,因为静态属性(
DataA
)在大多数情况下都返回
null

你知道哪里出了问题以及如何解决这个问题吗

public static class ClassA
{
    public static string DataA { get; set; }
    public static string DataB { get; set; }
    
    public static void SetAppConfig(string appSettingsPfad)
    {
        IList<JProperty> appSettings = JsonConvert.DeserializeObject<JToken>(appSettingsPfad).Select(j => (JProperty)j).ToList();

        var appKonfiguration = typeof(ClassA).GetProperties(BindingFlags.Public | BindingFlags.Static);

        foreach (JProperty property in appSettings)
        {
            var appKonfigurationProperty = appKonfiguration.SingleOrDefault(p => p.Name.Equals(property.Name, StringComparison.OrdinalIgnoreCase));
            var value = ((JValue)property.Value).Value;

            if (appKonfigurationProperty != null)
                appKonfigurationProperty.SetValue(null, Convert.ChangeType(value, appKonfigurationProperty.PropertyType));
        }
    }
}

[TestFixture]
public class DummyTest
{
    [Test]
    public void TestA()
    {
        LoadAppConfig();
        
        // DataA returns null here
        Console.WriteLine(ClassA.DataA);
        
        new BusinessLogicClass.DoSomething();
        // [...]
    }
    
    private void LoadAppConfig() {
        // [...]
        string appSettings = File.ReadAllText(jsonConfigFiles.Single());
        ClassA.SetAppConfig(appSettings);
        
        // here it works and a result is the proper string
        Console.WriteLine(ClassA.DataA);
        // [...]
    }
}

public class BusinessLogicClass {
    
    public void DoSomething() {
        // DataA returns null here
        Console.WriteLine(ClassA.DataA);
        // [...]
    }
}
公共静态类ClassA
{
公共静态字符串DataA{get;set;}
公共静态字符串DataB{get;set;}
公共静态void SetAppConfig(字符串appsetingspfad)
{
IList appSettings=JsonConvert.DeserializeObject(appSettingsPfad).Select(j=>(JProperty)j.ToList();
var appKonfiguration=typeof(ClassA).GetProperties(BindingFlags.Public | BindingFlags.Static);
foreach(appSettings中的JProperty属性)
{
var appKonfigurationProperty=appKonfiguration.SingleOrDefault(p=>p.Name.Equals(property.Name,StringComparison.OrdinalIgnoreCase));
var值=((JValue)property.value).value;
if(appKonfigurationProperty!=null)
SetValue(null,Convert.ChangeType(value,appKonfigurationProperty.PropertyType));
}
}
}
[测试夹具]
公共类Dummy测试
{
[测试]
公共无效遗嘱()
{
LoadAppConfig();
//DataA在这里返回null
Console.WriteLine(ClassA.DataA);
新的BusinessLogicClass.DoSomething();
// [...]
}
私有void LoadAppConfig(){
// [...]
字符串appSettings=File.ReadAllText(jsonConfigFiles.Single());
ClassA.SetAppConfig(appSettings);
//它在这里工作,结果是正确的字符串
Console.WriteLine(ClassA.DataA);
// [...]
}
}
公共类业务逻辑类{
公共无效剂量测定法(){
//DataA在这里返回null
Console.WriteLine(ClassA.DataA);
// [...]
}
}

(我已将此代码简化到最低限度,原始代码在进行空检查后将出现异常)

请从中删除与配置相关的代码,因为它不是
DataA
。您能否进一步简化(即不从配置文件中读取)?尽量简短。@jdweng OP问题与TLS有什么关系?没有得到什么@jdweng的回复?我的意思是,当然,这可能是相关的-但如果是这样的话,你是如何计算出来的?@mjwills没有这个代码部分,数据的设置方式就不清楚了,因为涉及到的反射也可能涉及到下面的问题…@JanS。你创建一个模型的目的是缩小问题的范围。这就是最小值。那是你的工作。也许它是相关的,但当你简化它时,你就会知道它是否相关。关键是你要给我们一个尽可能小的样本来重现这个问题。您的代码并不是最小的,因为有太多的活动部件。一直拿走东西,直到测试开始。然后关注您所做的最后一次更改-因为这是问题所在。请从中删除与配置相关的代码,因为它不是
DataA
。您能否进一步简化(即不从配置文件中读取)?尽量简短。@jdweng OP问题与TLS有什么关系?没有得到什么@jdweng的回复?我的意思是,当然,这可能是相关的-但如果是这样的话,你是如何计算出来的?@mjwills没有这个代码部分,数据的设置方式就不清楚了,因为涉及到的反射也可能涉及到下面的问题…@JanS。你创建一个模型的目的是缩小问题的范围。这就是最小值。那是你的工作。也许它是相关的,但当你简化它时,你就会知道它是否相关。关键是你要给我们一个尽可能小的样本来重现这个问题。您的代码并不是最小的,因为有太多的活动部件。一直拿走东西,直到测试开始。然后把注意力集中在你最后做的改变上——因为这就是问题所在。