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
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 […]
avril
2007
J’ai été surpris par le comportement du RealProxy : Le code suivant : internal class BusinessProxy<BusinessType> : RealProxy where BusinessType : BusinessObject, new() { private BusinessType _businessObject; protected BusinessProxy(BusinessType businessObject) : base(typeof(BusinessType)) { _businessObject = businessObject; } public static BusinessType Create() { return CreateProxy(new BusinessType()); } public static BusinessType CreateProxy(BusinessType businessObject) { return (BusinessType)(new BusinessProxy<BusinessType>(businessObject).GetTransparentProxy()); […]
avril
2007
Dans ce cas, public class C1 { public string Prop1 { get; set; } } public class C2 : C1 { public string Prop2 { get; set; } } typeof(C2).GetProperty("Prop1") retourne bien la propriété Prop1 de C1. En revanche, dans ce cas, public interface I1 { string Prop1 { get; set; } } public interface I2 : I1 { string Prop2 { get; set; } } typeof(I2).GetProperty("Prop1") retourne null […]
mars
2007
Désolé Florent, c’est encore du VB J’ai eu une énorme surprise aujourd’hui. J’avais une propriété de type IEnumerable et je voulais faire un GetType sur Value. En C#, cela se fait très bien : class Program { static void Main(string[] args) { List<string> l = new List<string>(); Test.Toto = l; Console.ReadLine(); } } public class Test { public static IEnumerable Toto { […]
mars
2007
Pour déduire la longueur maximale d’un champ à partir du Regex qu’il doit respecter, on a besoin du RegexTree. Le problème est que cette classe est internal au framework. Il existe donc deux possibilités pour récupérer le RegexTree : recoder le parse du pattern afin d’obtenir le RegexTree. Utiliser la réflection pour taper dans la classe internal au framework. En effet, la réflection permet de d’appeler des classes ou des membres de celles-ci même si […]