1

内部クラスである JSON クラス オブジェクトがあります。JSON デシリアライゼーション コードだけがそれを行うようにしたいので、他のコードがその型のオブジェクトを作成しようとするのを防ぐために、その方法を維持したいと思います。クラス型を変数として使用できますが、その型のオブジェクトを返そうとすると、メソッドがpublicでクラスがinternalであるため、一貫性のないアクセシビリティコンパイラ エラーが発生します。

この状況を解決する最善の方法は何ですか? 内部クラス用のインターフェースを作成してそれを渡すことができると思いますが、それは、使用しているすべての JSON クラスに対して余分な荷物を作成する必要があり、それらをたくさん使用していることを意味します。

編集: Jon Skeet によって提案された変更を行い、問題は解決しました。クラスをデフォルトで public と宣言する習慣があるため、この問題に陥りました。同じことをしている他の人のためにこれを指摘しています。

// 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 に答える