使用内部类型(C#)声明公共类方法的可访问性错误不一致?

时间:2013-04-29 13:10:05

标签: c# public internal class-visibility

我有一个JSON类对象,它是一个内部类。我希望保持这种方式,以防止其他代码尝试创建该类型的对象,因为我只希望JSON反序列化代码这样做。我可以使用类类型作为变量,但是如果我尝试返回该类型的对象,我会得到不一致的accessibiliy 编译器错误,因为该方法是 public 和类是内部

解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个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;
}

2 个答案:

答案 0 :(得分:6)

  

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

您需要公开JsonPetShelters,或将GetShelters()设为内部。

所以你希望能够从不同的程序集中调用此方法?如果是这样,您如何期望调用者使用它,而不了解返回类型?如果没有,为什么方法公开?

一旦你找到了想要以一致的方式实现的目标,那么改变应该很简单。

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

internal JsonPetShelters GetShelters()
{ 
    ...
}

编译时错误将消失,您将不再暴露出您不想首先公开的成员。

答案 1 :(得分: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() {}
}