avril
2007
Eric Lippert a posté une série 3 posts intitulés « Practice thinking like a compiler tester »(1, 2 et 3) que je trouve assez rigolo. Je n’en reviens toujours pas que ce genre de chose compilent : public class C : A { } public class A { public class D : C { } }
avril
2007
Dans un post précédent, je comparais l’implémentation des interfaces en VB et C#. Je suis tombé sur un problème spécifique au VB aujourd’hui : J’étais dans le cas d’une classe qui a décidé d’implémenter les propriétés d’une interface qu’elle implémente en leur donnant d’autres noms. Ex : Interface ITest Property Prop() As String End Interface Class Test Public Property P() As String Implements ITest.Prop […] End […]
avril
2007
Une limitation des génériques repose dans le fait que le type doit être défini à la compilation ! Cependant, on peut tout de même feinter public IList GetMaxTypedList(IEnumerable values) { Type t = null; foreach (object o in values) if (t == null) t = o.GetType(); else t = Pgcd(t, o.GetType()); IList list = Activator.CreateInstance(Type.GetType("System.Collections.Generic.List`1[[" + t.ToString() + ", […]
avril
2007
J’ai essayé d’améliorer l’exemple de Mike Taulty. Voici le code wue je propose : namespace System.Collections.Generic { public static class IEnumerableExtension { public static DataTable ToDataTable<T>(this IEnumerable<T> enumerable) { return ToDataTable(enumerable, null); } public static DataTable ToDataTable<T>(this IEnumerable<T> enumerable, Func<IEnumerable<PropertyInfo>, IEnumerable<PropertyInfo>> filterPropertiesDelegate) { DataTable table = new DataTable(); IEnumerable<PropertyInfo> props = […]
avril
2007
Dans mon article sur le DataBinding avancé, j’utilisais la méthode suivante : private Control FindBoundControl(object dataSource, string propertyName) { if (BindingContext[dataSource] == null) return null; foreach (Binding binding in BindingContext[dataSource].Bindings) if (binding.BindingMemberInfo.BindingField == propertyName) return binding.Control; return null; } En utilisant C# 3.0, je fais plutôt ceci : public static class BindingContextExtensionMethods { public static Control FindControl(this BindingContext bindingContext, object dataSource, string propertyName) […]
avril
2007
Comme je viens de le voir sur ce blog, il est possible de caster un objet en anonymous type. Ce n’est pas très compliqué mais je n’y avais pas pensé.
avril
2007
Dans mon article sur le DataBinding avancé, je montre comment rajouter des propriétés virtuelles sans toucher au code d’une classe. Dans le cas où on puisse modifier le code de la classe, on peut aussi rajouter des propriétés virtuelles en utilisant l’interface ICustomTypeDescriptor. Voici un exemple d’implémentation : public class Person : ICustomTypeDescriptor { private DateTime _birthDay = new DateTime(1981, 11, 18); public Person() { } public DateTime […]
avril
2007
En C#, vous avez le menu contextuel Refactor depuis VS 2005. Quand on y a goûté, difficile de s’en passer. Et pourtant, c’est bien ce que j’ai fait depuis le 1er février. En effet, en VB, Refactor n’existe pas. Et, alors que je m’étais résigné, j’ai vu un webcast des techdays d’Eric Mittelette et Mitsuru Furuta sur Orcas. A travers ce webcast, Eric Mittelette a amélioré mon quotidien ! Il y a un Refactor pour […]
avril
2007
Dans le code suivant : var test = new { PropertyStr = "un", PropertyInt = 1 }; Type t = Type.GetType("System.Collections.Generic.List`1[" + test.GetType().ToString() + "]"); t est égal au type d’une liste de mon type anonyme. Dans le code suivant : Type t = Type.GetType("System.Collections.Generic.List`1[" + typeof(string).ToString() + "]"); t est égal à typeof(List<string>) Et dans le code suivant : Type t = Type.GetType("System.Collections.Generic.List`1[" + typeof(Control).ToString() + "]"); t est égal à null ! […]
avril
2007
Je me suis retrouvé confronté à un problème auquel je ne m’attendais pas dans mon mapping objet relationnel. Comme vous le savez sûrement, les enums peuvent être castés en int et inversement. En revanche, on a un problème avec les nullable d’enum. En base, j’utilise une colonne de type int facultative pour représenter un nullable d’enum. J’ai fait un mapping objet relationnel générique (au sens général du terme) qui s’appuie sur la reflection pour renseigner […]