Domanda

Ho più classi in un progetto che sono esattamente lo stesso, tranne per il nome della classe.Fondamentalmente, essi rappresentano glorificato enumerazioni caricato a runtime dal file di configurazione.Le classi di simile a questo:

public class ClassName : IEquatable<ClassName> {
    public ClassName(string description) {
        Description = description;
    }

    public override bool Equals(object obj) {
        return obj != null &&
            typeof(ClassName).IsAssignableFrom(obj.GetType()) && 
            Equals((ClassName)obj);
    }

    public bool Equals(ClassName other) {
        return other != null && 
            Description.Equals(other.Description);
    }

    public override int GetHashCode() {
        return Description.GetHashCode();
    }

    public override string ToString() {
        return Description;
    }

    public string Description { get; private set; }
}

Non vedo il motivo per copiare questo file e cambiare il nome della classe più volte.Sicuramente c'è un modo posso elenco delle classi voglio e li hanno creati automaticamente per me.Come?

È stato utile?

Soluzione

Io suggerirei usando T4. Un notevole vantaggio di questo corso frammenti di codice è che se si cambia il modello allora tutto il codice verrà aggiornato di conseguenza.

Mettere questo in un file con estensione .tt

<#@ template language="C#" #>
<#@ output extension=".codegen.cs" #>
<#@ assembly name="System.dll" #>
<#@ import namespace="System" #>
// <auto-generated>
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// </auto-generated>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyStuff
{
<# foreach (string classname in classes) {#>
    public class <#= classname #> : IEquatable<ClassName> 
    {
            public <#= classname #>(string description) {
        Description = description;
    }

    public override bool Equals(object obj) {
        return obj != null &&
            typeof(<#= classname #>).IsAssignableFrom(obj.GetType()) && 
            Equals((<#= classname #>)obj);
    }

    public bool Equals(<#= classname #>other) {
        return other != null && 
            Description.Equals(other.Description);
    }

    public override int GetHashCode() {
        return Description.GetHashCode();
    }

    public override string ToString() {
        return Description;
    }

    public string Description { get; private set; }
    }
    }

<# } #> 
}

<#+ string[] classes = new string[] {  "Class1",
                                       "Class2" };
#>

VS genererà un file sorgente per voi. Basta aggiungere al classes matrice quando si ha bisogno di una nuova classe.

Altri suggerimenti

Potresti utilizzare l'ereditarietà con i generici?

public class MyBase<T> : IEquatable<MyBase<T>>
    where T : MyBase
{
    public ClassName(string description) {
        Description = description;
    }

    public override bool Equals(object obj) { ... }

    public bool Equals(T other) {
        return other != null && 
            Description.Equals(other.Description);
    }

    public override int GetHashCode() { ... }

    public override string ToString() { ... }

    public string Description { get; private set; }
}

Poi si potrebbe ereditare in questo modo:

public class ClassName1 : MyBase<ClassName1> { ... }
public class ClassName2 : MyBase<ClassName2> { ... }
public class ClassName3 : MyBase<ClassName3> { ... }

Avete considerato frammenti di codice ?

Se le classi sono in realtà la stessa esatta, potresti utilizzare eredità?La quantità di codice è piuttosto piccolo e non richiede alcuna supplementare pre/post-elaborazione.

public class Equatable : IEquatable { ... }

public class ClassName1 : Equatable {}
public class ClassName2 : Equatable {}
public class ClassName3 : Equatable {}
public class ClassName4 : Equatable {}

NOTA:Tutti gli snippet di codice suggerimenti sembrano sarebbero un incubo nella manutenzione lungo la strada se si ha il bisogno di cambiare qualcosa.

Vorrei suggerire di creare frammento di codice da soli, che sarà semplice e veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top