Si hay un gran número de dichas clases, todas tienen el mismo patrón, y con frecuencia tiene que actualizar sus definiciones, considere usar generación de código para escupir automáticamente los archivos fuente C# para todas las clases, para que no tiene que mantenerlos manualmente. La entrada al generador de código sería simplemente un formato de archivo de texto simple que puede analizar fácilmente, indicando los nombres y tipos de las propiedades necesarias en cada clase.
Si solo hay un pequeño número de ellos, o las definiciones cambian con muy poca frecuencia durante el proceso de desarrollo, entonces es poco probable que valga la pena, en cuyo caso también puede mantenerlos a mano.
Actualización:
Ésta es probablemente muy por encima de un ejemplo sencillo, pero fue muy divertido para averiguar!
En Visual Studio 2008, si se agrega un archivo llamado CodeGen.tt
a su proyecto y luego pegar esto en él, usted tiene los ingredientes de un sistema de generación de código:
<#@ 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;
}
} <# } #>
}
<# } #>
}
Hay una cadena simple literal llamada src
en el que se declara las clases que necesita, en un formato simple:
Foo: string Prop1,
int Prop2;
Bar: string FirstName,
string LastName,
int Age;
para que pueda añadir fácilmente cientos de declaraciones similares. Siempre que guarde los cambios, Visual Studio ejecutará la plantilla y generará CodeGen.cs
como salida, que contiene la fuente de C# para las clases, completa con la lógica IsDirty
.
Puede cambiar la plantilla de lo que se produce alterando la última sección, donde pasa por el modelo y produce el código. Si usó ASP.NET, es similar a eso, excepto que genera fuente C# en lugar de HTML.
Buena respuesta (1) Mi única sugerencia sería implementar IChangeTracking (http://msdn.microsoft.com/en -us/library/system.componentmodel.ichangetracking.aspx) en lugar de crear su propia propiedad IsDirty. –
John Myczek: no estaba al tanto de esa interfaz, cambiaré mis proyectos favoritos para usar esto inmediatamente (o tan pronto como ese molesto lo de 'vida' lo permite). Gracias :) –
No sabía nada de eso John –