Noob C# Class 声明问题

Noob C# Class Declaration Issue

所以我使用 json2csharp

创建了一个 class
    public class ResponseType
    {
        public class Query
        {
            public string q { get; set; }
            public object sku { get; set; }
            public int limit { get; set; }
            public object reference { get; set; }
            public object mpn_or_sku { get; set; }
            public string mpn { get; set; }
            public object brand { get; set; }
            public string __class__ { get; set; }
            public int start { get; set; }
            public object seller { get; set; }
        }

        public class Request
        {
            public bool exact_only { get; set; }
            public string __class__ { get; set; }
            public List<Query> queries { get; set; }
        }

        public class Seller
        {
            public string display_flag { get; set; }
            public bool has_ecommerce { get; set; }
            public string name { get; set; }
            public string __class__ { get; set; }
            public string homepage_url { get; set; }
            public string id { get; set; }
            public string uid { get; set; }
        }

        public class Prices
        {
            public List<List<object>> USD { get; set; }
            public List<List<object>> JPY { get; set; }
            public List<List<object>> CNY { get; set; }
        }

        public class Offer
        {
            public string sku { get; set; }
            public string packaging { get; set; }
            public string on_order_eta { get; set; }
            public string last_updated { get; set; }
            public int? order_multiple { get; set; }
            public int in_stock_quantity { get; set; }
            public string eligible_region { get; set; }
            public int? moq { get; set; }
            public int? on_order_quantity { get; set; }
            public object octopart_rfq_url { get; set; }
            public string __class__ { get; set; }
            public Seller seller { get; set; }
            public string product_url { get; set; }
            public object factory_order_multiple { get; set; }
            public string _naive_id { get; set; }
            public int? factory_lead_days { get; set; }
            public Prices prices { get; set; }
            public bool is_authorized { get; set; }
            public bool is_realtime { get; set; }
        }

        public class Brand
        {
            public string homepage_url { get; set; }
            public string __class__ { get; set; }
            public string name { get; set; }
            public string uid { get; set; }
        }

        public class Manufacturer
        {
            public string homepage_url { get; set; }
            public string __class__ { get; set; }
            public string name { get; set; }
            public string uid { get; set; }
        }

        public class Item
        {
            public List<Offer> offers { get; set; }
            public string uid { get; set; }
            public string mpn { get; set; }
            public List<object> redirected_uids { get; set; }
            public Brand brand { get; set; }
            public string octopart_url { get; set; }
            public string __class__ { get; set; }
            public Manufacturer manufacturer { get; set; }
        }

        public class Result
        {
            public List<Item> items { get; set; }
            public int hits { get; set; }
            public string __class__ { get; set; }
            public object reference { get; set; }
            public object error { get; set; }
        }

        public class RootObject
        {
            public int msec { get; set; }
            public Request request { get; set; }
            public string __class__ { get; set; }
            public List<Result> results { get; set; }
        }
    }

问题出在设计时,当我声明一个类型为 class:

的变量时

ResponseType Response = new ResponseType();

Intellisense 不允许我访问子classes RootObject.results 列表。它只显示 EqualsGetHashCodeGetTypeToString。我假设我在 class 声明中做错了什么。

提前致谢!

编辑 -- 我是 C Sharp 的新手。我正在尝试解析来自 REST API 的响应。我将 Rest API 提供的 JSON 并使用 json2csharp 将其转换为 class。我的意图是做这样的事情

函数内 return:

    public ResponseType ExecuteSearch(String PartNumber)
    {

~ 生成请求的所有代码

        // Perform the search and obtain results
        var data = client.Execute(req).Content;
        JSON = data;

    return JsonConvert.DeserializeObject<ResponseType>(data);
    }

然后能够将响应作为函数外部的对象进行访问

编辑 2:

我明白我做了什么。我应该简单地将 RootObject 重命名为 ResponseType,而不是将所有内容嵌套在 ResponseType 中。

Intellisense does not allow me to access the subclasses RootObject.results list

这是因为 属性 results 不是静态的,您尝试以这种方式访问​​它。通过 ClassName.PropertyName 访问静态 属性。有关 static variables 的更多信息,请查看 link。

It only shows Equals, GetHashCode, GetType and ToString

这是 C# 中的每个对象都从 class object 继承的基本方法集。这就是为什么你能看到它。

Intellisense 将允许您这样做:

ResponseType.RootObject ro = new ResponseType.RootObject();
ro.results.First();

因为您将需要 class 的一个实例来访问 属性 results

I am assuming I did something wrong in my class declaration.

视情况而定。基本上,如果编译器没有抱怨,那么您就可以按预期声明 classes。但是属性的声明命令您以特定方式访问它们。因此,如果您仍想使用 RootObject.results 访问 results,则需要将其设置为 static:

public class RootObject
{
    public static List<Result> results { get; set; }
}

但请注意,此列表只会存在一次!并且对于 RootObject 的每个实例都不是单独的!由于您嵌入了 classes,因此您需要这样调用它:

ResponseType.RootObject.results.WhatEver();

编辑

我猜您想在 ResponseType 类型的对象中获取 RootObject 类型的对象。如果我是对的,那么没有必要在 ResponseType 中声明 classes,但你必须在其中声明每种类型的变量,如:

public class ResponseType
{
    public RootObject MyRootObject{ get; set; }
}

public class RootObject
{
    public int msec { get; set; }
    public Request request { get; set; }
    public string __class__ { get; set; }
    public List<Result> results { get; set; }
}

现在您将能够访问 ResponseType 对象中的 results 变量:

ResponseType rt = new ResponseType();
rt.MyRootObject.results.WhatEver();

有关如何将 JSON 反序列化为 classes 的更多信息,请阅读 Deserialize JSON to C# Classes post

1) ResponseType class 的对象不包含任何字段(事件静态字段)。 2) 你声明了 ResponseType 对象,但是 resultsRootObject 对象的字段。

因此,如果您想使用 results,您应该这样做:

ResponseType.RootObject rootObject = new ResponseType.RootObject();
rootObject.results.DoWork();

以下是我认为您正在尝试做的事情。如果这是某种数据传输对象 (DTO),我只会以这种形式使用它,否则对于将在代码中使用的 class 来说是非常糟糕的做法(主要是因为 public所有字段上的 getter 和 setter 以及与 class 名称匹配的字段名称),但它确实显示了您的主要错误,那就是 classes 需要在您的主要 [=13] 之外定义=],如果您需要在顶层 class 中使用那种类型的 class,您需要定义一个 public 字段来访问它。

public class ResponseType
{
    public Query Query { get; set; }
    public Request Request { get; set; }
    public Seller Seller { get; set; }
    public Prices Prices { get; set; }
    public Offer Offer { get; set; }
    public Brand Brand { get; set; }
    public Manufacturer Manufacturer { get; set; }
    public Item Item { get; set; }
    public Result Result { get; set; }
    public RootObject RootObject { get; set; }
}

public class Query
{
    public string q { get; set; }
    public object sku { get; set; }
    public int limit { get; set; }
    public object reference { get; set; }
    public object mpn_or_sku { get; set; }
    public string mpn { get; set; }
    public object brand { get; set; }
    public string __class__ { get; set; }
    public int start { get; set; }
    public object seller { get; set; }
}
public class Request
{
    public bool exact_only { get; set; }
    public string __class__ { get; set; }
    public List<Query> queries { get; set; }
}
public class Seller
{
    public string display_flag { get; set; }
    public bool has_ecommerce { get; set; }
    public string name { get; set; }
    public string __class__ { get; set; }
    public string homepage_url { get; set; }
    public string id { get; set; }
    public string uid { get; set; }
}
public class Prices
{
    public List<List<object>> USD { get; set; }
    public List<List<object>> JPY { get; set; }
    public List<List<object>> CNY { get; set; }
}
public class Offer
{
    public string sku { get; set; }
    public string packaging { get; set; }
    public string on_order_eta { get; set; }
    public string last_updated { get; set; }
    public int? order_multiple { get; set; }
    public int in_stock_quantity { get; set; }
    public string eligible_region { get; set; }
    public int? moq { get; set; }
    public int? on_order_quantity { get; set; }
    public object octopart_rfq_url { get; set; }
    public string __class__ { get; set; }
    public Seller seller { get; set; }
    public string product_url { get; set; }
    public object factory_order_multiple { get; set; }
    public string _naive_id { get; set; }
    public int? factory_lead_days { get; set; }
    public Prices prices { get; set; }
    public bool is_authorized { get; set; }
    public bool is_realtime { get; set; }
}
public class Brand
{
    public string homepage_url { get; set; }
    public string __class__ { get; set; }
    public string name { get; set; }
    public string uid { get; set; }
}
public class Manufacturer
{
    public string homepage_url { get; set; }
    public string __class__ { get; set; }
    public string name { get; set; }
    public string uid { get; set; }
}
public class Item
{
    public List<Offer> offers { get; set; }
    public string uid { get; set; }
    public string mpn { get; set; }
    public List<object> redirected_uids { get; set; }
    public Brand brand { get; set; }
    public string octopart_url { get; set; }
    public string __class__ { get; set; }
    public Manufacturer manufacturer { get; set; }
}
public class Result
{
    public List<Item> items { get; set; }
    public int hits { get; set; }
    public string __class__ { get; set; }
    public object reference { get; set; }
    public object error { get; set; }
}
public class RootObject
{
    public int msec { get; set; }
    public Request request { get; set; }
    public string __class__ { get; set; }
    public List<Result> results { get; set; }
}