Net Core访问内部类成员的简单方法

时间:2018-09-22 02:11:22

标签: c#

我声明了一个嵌套类,我试图用一个点访问下面的多个内部成员。对于多个内部类,最简单的方法是什么? 这是在我复制JSON数据并运行选择性粘贴->将JSON粘贴为类时发生的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WeatherTest.Models
{
    public class OpenWeatherResponse 
    {
        public class Coord
        {
            public float lon { get; set; }
            public float lat { get; set; }
        }

        public class Main
        {
            public float temp { get; set; }
            public int pressure { get; set; }
            public int humidity { get; set; }
            public float temp_min { get; set; }
            public float temp_max { get; set; }
        }
    }
}

在程序的另一部分,出现错误: OpenWeatherResponse.Main”不包含“临时”的定义

 OpenWeatherResponse rawWeather = new OpenWeatherResponse();
 Temp = rawWeather.Main.temp,

2 个答案:

答案 0 :(得分:2)

在您的示例中,Main是一种类型,而不是对象的实例。但是,您正在尝试访问实例成员。

您可以执行以下两项操作之一:

选项A。不要在Main中使用实例成员。使用静态成员。

public class OpenWeatherResponse 
{
    public class Main
    {
        static public float temp { get; set; }
        static public int pressure { get; set; }
        static public int humidity { get; set; }
        static public float temp_min { get; set; }
        static public float temp_max { get; set; }
    }
}

选项B。创建一个属性,该属性将保存一个Main的实例,并使用该实例。为了避免符号歧义,我将类重命名为MainClass,并公开了名为Main的属性:

public class OpenWeatherResponse 
{
    public class MainClass
    {
        public float temp { get; set; }
        public int pressure { get; set; }
        public int humidity { get; set; }
        public float temp_min { get; set; }
        public float temp_max { get; set; }
    }

    public MainClass Main { get; set; } = new MainClass();
}

这些解决方案中的任何一个都将允许此代码按原样工作:

OpenWeatherResponse rawWeather = new OpenWeatherResponse();
Temp = rawWeather.Main.temp,

答案 1 :(得分:2)

简而言之,除非您的类是static(根据昨天使用序列化的问题,请不要在此处使用static),否则您将无法按预期访问它们。

原因是,尽管您有嵌套的类,但是实例之间没有关系:

public class A
{
    public class B
    {
    }
}

B存在,但未被引用为A的成员。

相反,您需要将B引用为A的属性:

public class A
{
    public B B { get; set; }
}

public class B
{
    public string C {get;set;}
}

我已经取消了对类的嵌套,因为这并不是必须的。当然,您仍然可以这样做。

现在,当您创建A的实例时,就可以访问B:

var val = new A();
val.B = new B();
val.B.C = "hello";

因此,要修复您的代码,可以将其更改为:

public class OpenWeatherResponse 
{
    public Coord Coord { get; set; }
    public Main Main { get; set; }
}

public class Coord
{
    public float lon { get; set; }
    public float lat { get; set; }
}

public class Main
{
    public float temp { get; set; }
    public int pressure { get; set; }
    public int humidity { get; set; }
    public float temp_min { get; set; }
    public float temp_max { get; set; }
}

对不起,我对此的解释不太好。希望你明白我的意思:-)