1

我有一个 JSON 类对象,它是一个内部类。我想保持这种方式以防止其他代码尝试创建该类型的对象,因为我只希望 JSON 反序列化代码执行此操作。我可以将类类型用作变量,但是如果我尝试返回该类型的对象,则会出现不一致的可访问性编译器错误,因为该方法是public并且类是internal

解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个 JSON 类创建额外的包袱,而且我使用了很多。

编辑:我做了 Jon Skeet 建议的改变,问题就消失了。由于默认情况下将我的课程声明为公共的习惯,我遇到了这个问题。我为其他正在做同样事情的人指出这一点。

// The internal class.
internal class JsonPetShelters
{

    [JsonProperty("@encoding")]
    public string Encoding { get; set; }

    [JsonProperty("@version")]
    public string Version { get; set; }

    [JsonProperty("petfinder")]
    public Petfinder Petfinder { get; set; }
}

// This method gets the inconsistent accessibility error since
//   JsonPetShelters is an internal class.
public JsonPetShelters GetShelters()
{
    // For example purposes only
    return null;
}
4

2 回答 2

6

解决这种情况的最佳方法是什么?

您要么需要JsonPetShelters公开,要么需要GetShelters()内部公开。

那么您希望能够从不同的程序集中调用此方法吗?如果是这样,在不了解返回类型的情况下,您希望调用者如何使用它?如果不是,为什么该方法是公开的?

一旦您以一致的方式确定了您想要实现的目标,那么进行更改应该很简单。

编辑:正如您所说,您只希望同一程序集中的代码能够调用该方法,只需将其更改为内部:

internal JsonPetShelters GetShelters()
{ 
    ...
}

编译时错误将消失,您将不再公开您一开始不想公开的成员。

于 2013-04-29T13:12:09.503 回答
3

您可以显式声明该类Constructor并使其成为内部类,而该类仍然是公共的。

这将允许每个程序集使用该类,但只有您的程序集可以创建实例。

public class JsonPetShelters
{

    [JsonProperty("@encoding")]
    public string Encoding { get; set; }

    [JsonProperty("@version")]
    public string Version { get; set; }

    [JsonProperty("petfinder")]
    public Petfinder Petfinder { get; set; }

    internal JsonPetShelters() {}
}
于 2013-04-29T13:13:54.807 回答