【问题标题】:Noob C# Class Declaration IssueNoob C# 类声明问题
【发布时间】:2017-02-15 14:18:13
【问题描述】:

所以我使用 json2csharp 创建了一个类

    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; }
        }
    }

问题出在设计时,当我用我的类的类型声明一个变量时:

ResponseType Response = new ResponseType();

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

提前谢谢你!

编辑——我对 C Sharp 相当陌生。我正在尝试解析来自 REST API 的响应。我获取了 Rest API 提供的 JSON,并使用 json2csharp 将其转换为一个类。我的意图是做这样的事情

在函数内返回:

    public ResponseType ExecuteSearch(String PartNumber)
    {

~生成req的所有代码

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

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

然后能够以函数外部对象的形式访问响应

编辑 2:

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

【问题讨论】:

  • 你还没有定义任何字段,只是更多的类 - 你到底想在响应下访问什么?
  • 它将您需要的所有类都放在另一个类中,这真是太可怕了。我建议将该外部类更改为命名空间。
  • 你想完成什么?你为什么决定这个结构?你想在哪里访问results 变量?
  • 我编辑了问题以获取有关我的意图的更多信息。
  • 如果您使用 Visual Studio,比 json2csharp 更好的选择是内置函数 Edit -> Paste Special -> Paste JSON As Classes。这应该会给你类似于我下面的答案的代码。

标签: c# visual-studio intellisense


【解决方案1】:

Intellisense 不允许我访问子类 RootObject.results 列表

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

它只显示 Equals、GetHashCode、GetType 和 ToString

这是 C# 中每个对象从类 object 继承的一组基本方法。这就是你能看到它的原因。

Intellisense 将允许您这样做:

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

因为您需要该类的实例来访问属性results

我假设我在班级声明中做错了什么。

这取决于。基本上,如果编译器没有抱怨,那么你声明你的类是应该的。但是属性的声明命令您以特定方式访问它们。因此,如果您仍想使用RootObject.results 访问results,则需要使其成为static

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

但请注意,此列表只会存在一次!并且不是每个 RootObject 实例的个体!由于您有嵌入式类,因此您需要这样称呼它:

ResponseType.RootObject.results.WhatEver();

编辑

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

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 反序列化为类的更多信息,请阅读Deserialize JSON to C# Classes 帖子

【讨论】:

  • 感谢您的回复。我用更多关于我的意图的信息编辑了我的问题
  • @Cade 我根据更新的信息进行了编辑
  • @Cade 进行正确的反序列化,请在我的编辑中查看指向非常有用的帖子的链接
  • 我试试,谢谢。我的应用程序工作正常,但我使用 VAR 而不是定义类。不过,我更愿意定义类。我认为你的帖子会帮助我。谢谢
  • 我知道我做了什么。我应该简单地将 RootObject 重命名为 ResponseType,而不是将所有内容都嵌套在 ResponseType 中。
【解决方案2】:

1) 具有 ResponseType 类的对象不包含任何字段(事件静态一个)。 2) 你声明了ResponseType 对象,但resultsRootObject 对象的字段。

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

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

【讨论】:

    【解决方案3】:

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

    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; }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2021-12-03
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多