April 2008 Blog Posts
[OT] Los Angeles si avvicina

Dal 5 al 13 maggio sarò a Los Angeles per una bella vacanza. In molti mi hanno detto che 8 giorni sono pochi ma personalmente mi annoierei per più tempo. Preferisco fare più viaggi (Las Vegas, San Francisco e San Diego) ma dedicarmi a queste splendide città ad una per volta. Andrò da solo, per non avere distrazioni, per me è quasi un viaggio spirituale quello negli USA :-). Purtroppo credo che non avrò tempo di dedicarmi ai news group, ma per una settimana si può anche saltare no? E al mio ritorno un periodo abbastanza di fuoco, e non per il caldo, che forse non arriverà mai, almeno così sembra :-). Il giorno dopo il rientro inizierò una nuova avventura... Ah, oggi mi ha fatto molto piacere conoscere il Leone!

Matteo Migliore.

[C#] Clonare un oggetto via Reflection verso un altro tipo

Come fare se si volesse creare un Clone di un oggetto di tipo Foo1 ad un tipo Foo2 che ereditano da una stessa classe base? Ovvero, come fare un upcast? Avete i brividi eh? Beh come sempre sui news group si trovano le richieste più strane... :-).

public TRet Clone<TRet, TBase>(TBase obj) where TRet : TBase, new() {
    TRet ret = new TRet();
    PropertyInfo[] properties = typeof(TBase).GetProperties(
        System.Reflection.BindingFlags.Instance |
        System.Reflection.BindingFlags.Public
    );
    foreach (PropertyInfo property in properties) {
        object value = property.GetValue(obj, null);
        property.SetValue(ret, value, null);
    }
    return ret;
}

Qui l'esempio di chiamata:
public class Foo1 : ICommonInterface {
    public string Name { get; set; }
}
 
public class Foo2 : ICommonInterface {
    public string Name { get; set; }
}
 
public interface ICommonInterface {
    string Name { get; set; }
}
 
//Call sample
Foo1 foo1 = new Foo1 { Name = "Bill" };
Foo2 foo2 = Clone<Foo2, ICommonInterface>(foo1);


Matteo Migliore.

[OT] Cena addio MVP

Come sempre queste cene sono un divertimento assoluto, almeno per me, per quelli che mi devono sopportare probabilmente un po' meno :-). Quindi ringrazio tutti per la pazienza. Visto che ci sono, ma non sono io il vegetariano mascherato, qui in basso si può vedere la fattura che ho pagato io :-D (per i malfidenti c'è il link dell'immagine 100% :-D). Mi spiace comunque per chi ha dovuto pagare il rimanente :-(. Ultima cosa: mitica Sara!

[ASP.NET] Validare i controlli della pagina dato il ValidationGroup

Posto questi due metodi perchè ho trovato divertente riuscire a rendere il codice così striminzito grazie a C# 3.0 e alla ricorsione:

   1:    private void ValidateByGroup(string validationGroup) {
   2:     List<BaseValidator> validators = new List<BaseValidator>(from validator in FindControlsByType<BaseValidator>(this)
   3:                      where validator.ValidationGroup == validationGroup select validator);
   4:     validators.ForEach(validator => validator.Validate());
   5:    }
   6:   
   7:    private static IList<T> FindControlsByType<T>(Control root) where T: Control {
   8:     List<T> controls = new List<T>();   
   9:     foreach (Control child in root.Controls) {
  10:      Type type = child.GetType().BaseType;
  11:      while(type != typeof(object)){
  12:       if (type == typeof(T))
  13:       {
  14:        controls.Add((T)child);
  15:        break;
  16:       }
  17:       type = type.BaseType;
  18:      }
  19:   
  20:      if (child.HasControls())
  21:       controls.AddRange(FindControl<T>(child));
  22:     }
  23:     return controls;
  24:    }


Perchè funzioni è necessario disabilitare il controllo lato client impostando a False la proprietà EnableClientScript dei validator. Per rendere comunque la pagina reattiva sarebbe bene sfruttare AJAX perchè in questo modo il controllo verrà fatto solo lato server.

Matteo Migliore.

Add Comment Filed Under [ ASP.NET Tip ]