2016-06-26 16 views
11

Gut von der Begrenzung, verwende ich Visual Studio CE 2015, ich in der Regel 2. One Produktivität Hack aktualisieren, ist, dass ich leer Modellklassen wie zu erstellen:Prevent Visual Studio die Setter-Methode zum internen

public class PersonModel 
{ 
} 

und dann verwenden sie in einem ausgewählten Ausdruck wie:

db.People.Where(p => someCondition) 
.Select(p => new PersonModel 
{ 
    Id = p.Id, 
    Name = p.Name, 
    //set other properties 
}).ToList(); 

Dann gehe ich zu den noch nicht vorhandenen Eigenschaften Id und Name, ... und drücken Control+. Visual Studio generate property Id für mich zu fragen. All großen, aber es wird erstellen:

public int Id { get; internal set; } 

und wenn ich die gleiche Methode in einem asp.net WebAPI Modell Bindung verwenden, nicht die Bindung wird leise und gib mir Id = 0.

Also meine Frage ist: Gibt es eine Möglichkeit, VS fragen öffentlichen Setter zu erstellen, d.h .:

public int Id { get; set; } 

Antwort

3

Es gesetzt Zugriffsmodifikator zu internal weil Basis der aktuellen Code es der geeignete ist. In Ihrem Fall referenzieren Sie nur innerhalb derselben Baugruppe auf die erstellte Eigenschaft, sodass der Zugriffsmodifikator internal am besten geeignet ist. Ich glaube nicht, dass Sie dieses Verhalten ändern können.

Wenn Sie Resharper verwenden, erstellt es den öffentlichen Setter für Sie. Eine weitere Problemumgehung besteht darin, die Klassen, für die dieses Verhalten gelten soll, in eine andere Assembly zu verschieben.

+0

Danke für die Klärung der Ursache des Verhaltens. Ich hoffe wirklich, dass es einen Workaround gibt, der es vorzieht "öffentlich" zu "internal" – Alireza

+2

Es ist mir nicht klar, was es bedeutet "weil basierend auf dem aktuellen Code ist es der richtige", jedenfalls wenn die Klasse 'Serializable' ist Die interne Erreichbarkeit erlaubt keine korrekte Initialisierung: Der 'XmlSerializer' löst eine Ausnahme aus, da er nicht auf den Setter zugreifen kann. Außerdem schlage ich nicht vor, eine andere Assembly zu erstellen, um zu vermeiden, dass das 'interne' gelöscht wird. Es wäre nett, eine Möglichkeit zu haben, dieses Verhalten zu ändern, –

+0

@AngeloMascaro Es wird von asp.net mvc (oder Web-API) Modell verbindlich behandelt. Es ignoriert den internen Setter stillschweigend. – Alireza