Spar tid med Custom Attributes i dine klasser

Jeg har haft fornøjelsen af, at arbejde lidt med .NET op mod en MySQL database, hvor jeg ikke kunne bruge LinqToSQL.

Jeg har så i et andet projekt arbejdet med at have mine egne Custom Attributes på klasser og i det her projekt var det helt vild oplagt at bruge til at mappe databasens feltnavne op på klassernes properties.

Eksempel:

Klassen

public class Person {
  public string Name { get; set; }

  public Person() {

  }
}

Klassen med Custom Attribute

public class Person {
  [DbFieldName("name")]
  public string Name { get; set; }

  public Person() {

  }
}

Min egen attribute klasse

[System.AttributeUsage(System.AttributeTargets.Property)]
public class DbFieldName : System.Attribute
{
  private string name;
  public double version;

  public DbFieldName(string name)
  {
    this.name = name;
    version = 1.0;
  }

  public string GetName()
  {
    return (this.name);
  }
}

Pointen med Attributes er at du nøjes med at sætte dem på de Properties der skal gemmes i databasen, så når du skal lave din INSERT eller UPDATE så kører du lige sådan en stump kode her:
Jeg sender en instans a Person “objPerson” ind til metoden med denne kode

cmd.CommandText = "INSERT INTO Contacts(name) VALUES(?name);";
PropertyInfo[] properties = typeof(Person).GetProperties();
foreach (PropertyInfo property in properties)
{
  DbFieldName attr = property.GetCustomAttributes(typeof(DbFieldName), false).FirstOrDefault() as DbFieldName;
  if (attr != null)
  {
    string name = attr.GetName();

    IDbDataParameter param = cmd.CreateParameter();
    param.ParameterName = string.Format("?{0}",name);
    param.Value = property.GetValue(objPerson, null);
    cmd.Parameters.Add(param);
  }
}
cmd.ExecuteNonQuery();

Det er selvfølgelig lidt overkill at skrive sådan for at gemme én værdi i database tabellen, men jeg sad med tabeller med godt 20 felter og da jeg havde 6 klasser af denne type – så sparede jeg godt med tid og kunne give kunden en god pris for mit arbejde!

I et større projekt ville det give mening, at lave en klasse til at håndtere alle disse klasser Save og Get metoder ved at lave en generisk klasse på typen T.

Håber du får chance for at gøre en kunde glad med min inspiration her.

, , ,

Skriv et svar

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>