Se esiste un numero molto elevato di tali classi, tutte aventi lo stesso modello e spesso è necessario aggiornare le loro definizioni, considerare l'utilizzo della generazione del codice per sputare automaticamente i file di origine C# per tutte le classi, in modo da non è necessario mantenerli manualmente. L'input per il generatore di codice sarebbe semplicemente un semplice formato di file di testo che è possibile analizzare facilmente, indicando i nomi e i tipi delle proprietà necessarie in ogni classe.
Se ne esiste solo un piccolo numero o le definizioni cambiano molto di rado durante il processo di sviluppo, allora è improbabile che valga la pena, nel qual caso si potrebbe anche mantenerle a mano.
Aggiornamento:
Questo è probabilmente così sopra le righe per un semplice esempio, ma è stato divertente per capire!
In Visual Studio 2008, se si aggiunge un file chiamato CodeGen.tt
al progetto e quindi incollare questa roba in esso, avrete la stoffa di un sistema di generazione di codice:
<#@ template debug="false" hostspecific="true" language="C#v3.5" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#
// You "declare" your classes here, as in these examples:
var src = @"
Foo: string Prop1,
int Prop2;
Bar: string FirstName,
string LastName,
int Age;
";
// Parse the source text into a model of anonymous types
Func<string, bool> notBlank = str => str.Trim() != string.Empty;
var classes = src.Split(';').Where(notBlank).Select(c => c.Split(':'))
.Select(c => new
{
Name = c.First().Trim(),
Properties = c.Skip(1).First().Split(',').Select(p => p.Split(' ').Where(notBlank))
.Select(p => new { Type = p.First(), Name = p.Skip(1).First() })
});
#>
// Do not edit this file by hand! It is auto-generated.
namespace Generated
{
<# foreach (var cls in classes) {#> class <#= cls.Name #>
{
public bool IsDirty { get; private set; }
<# foreach (var prop in cls.Properties) { #>
private <#= prop.Type #> _storage<#= prop.Name #>;
public <#= prop.Type #> <#= prop.Name #>
{
get { return _storage<#= prop.Name #>; }
set
{
IsDirty = true;
_storage<#= prop.Name #> = value;
}
} <# } #>
}
<# } #>
}
C'è una semplice stringa letterale chiamato src
in cui si dichiara le classi è necessario, in un formato semplice:
Foo: string Prop1,
int Prop2;
Bar: string FirstName,
string LastName,
int Age;
così si può facilmente aggiungere centinaia di dichiarazioni simili. Ogni volta che salvi le modifiche, Visual Studio eseguirà il modello e produrrà CodeGen.cs
come output, che contiene l'origine C# per le classi, completo della logica IsDirty
.
È possibile modificare il modello di ciò che viene prodotto modificando l'ultima sezione, dove scorre attraverso il modello e produce il codice. Se hai usato ASP.NET, è simile a questo, tranne che per generare sorgenti C# invece di HTML.
Buona risposta (1) Il mio unico suggerimento sarebbe quello di implementare IChangeTracking (http://msdn.microsoft.com/en -us/library/system.componentmodel.ichangetracking.aspx) piuttosto che creare la tua proprietà IsDirty. –
John Myczek: ero completamente inconsapevole di quell'interfaccia, dovrò cambiare i miei progetti domestici per usarlo immediatamente (o appena quel fastidioso cosa 'vita' permette). Grazie :) –
Non lo sapevo o John –