scaling yourself

Saturday, June 15, 2013 Posted by

Hi, To be honest I did not know how to scaling myself especially at work or on any work I did. How to have time for everything? How to make priorities of my day activities to stay current and stay productive? So, I did not know how to doing so. But I had a goal. I made decision I will be Software Architect. You can believe me or not, but I did a lot of architect work and never I get this job position. Ok I get it once, but in the way I never want to get again. Anyway, I was fresh post graduated, it was July, 2005 and I just want to get first job. After a while I saw that I did a lot of things at work that really does not matter. Things that not helping me get me and my job position goal I had, Software Architect, remember? But this blog post is not about my goal I had and I still have. It is blog post about how to scaling myself. It is really related with SA goal somehow. Let me explains it better.

After a while in May 2009, I realized that I was in second work place and I cannot develop my skills. There is no option to became SA. But, I found on the Internet someone who was and who is SA. That was Marcin Celej, really great and wise man, I meet him at GL.PL and I first send message to him because of the my goal reason. I did not know how to be SA, so I thought that maybe he helping me somehow, advice something or I have a chance to somehow feel how to get it? This reminds me one presentation about Agile. Presenter finish this presentation with funny YT movie with Yoda make dubbing in studio. And also there was a question. Why Yoda had students? Why he train, mentor and coach, simple question what was most important reason I still remember this presentation and presenter. I was looking for answer a long time after a half of year it came to me. I found Steve Jobs explanation about his vision in computers as a tools for getting knowledge for students. Steve said that he makes computers for helping get knowledge. And also he explain that teachers will be always important, why? Because only teacher can inspire students to get knowledge. Sometimes different knowledge that teachers had. Sometimes in a completely different area. But because of some reason good teacher helps students to find theirs way :) . Steve said and make it simple. Teachers are needed always because they are proactive, it is thing that cannot be done by any computer. Even if you are using computer always is someone behind. So you want to learn how to scaling yourself you can ask someone or watch his presentation, lecture or email course :) .

That was something I get from Marcin. I participate to his course about manage time at cioswnos.pl, great site anyway :) . Marcin had also MVP title that time, not a big deal, but this time it means something to me. He is successful, I am not. So, maybe he will teach me? So I participate to his course, and email after some portion of emails I realized that I am wasting my time, really. I need to change something, go step forward because I am on the way to nowhere. I mansion it was middle of 2009? First crisis time, remember? After a few months I quit job, and I was starting for shaping my live in the way I want. It was really scary of the time, but for a first time I go out my comfort zone and I had nothing, most important nothing to loose. To be honest, I pay a lot because of my decision to made this up. I was looking for a work anywhere. And I realized that I cannot be SA. I have only a bit of knowledge about producing software. I have not blog. I did not know English and I still learn it by may self, mostly on this blog :P . I was weak students at my technical university. So I go to the first work I have chance to go. And I start to study. Not the way like before when I have so many reasons to not learn. Most important was always, I do not need this, I know that :P . That was my blocker this time and very often is blocker for many people. Feeling that you know that prevents from learning mostly, you know. So it was winter 09/10 and I just want to learn. I am not really know how good I am now? How much I scale myself? I see fruits of my work that made me happy. I am not afraid to say to manager of project I work in. I do not want to work with you anymore. I am good enough to be honest and find different work place. Personal freedom for me you know especially in current crazy times. So if you want to know how to do that just watch someone who is proactive and who present those subjects really cool and Scott does not sucks too much :) . Anyway I learn all that from Marcin. Scott just reminds it to me, as you know I was on DevDay 2012, best conference since a while to me. Hope you enjoy it.

P ;) .

new blog title

Sunday, June 9, 2013 Posted by

Hi, I changed today title of my blog. I am happy to introduce new “coding by to design” title that in my opinion much more better describe and express what exactly I am trying to do every single day.

P ;) .

first year with bonsai hobby

Sunday, June 9, 2013 Posted by

…new fledged birds forsaking nest on tree just after their wings end to grow…

image

P ;) .

my one tao path

Saturday, June 8, 2013 Posted by

taoHi, I have not any of social web portal account anymore. Not at all, and that is great. I read once. “Do you know how to make money on FB? Delete account and go to the work” :) . That make impression on me. This simple quote helped me to delete all my social accounts about 3 months ago and I am happy free man again, you may wonder from what? From a lot of things that all of my contacts share, from checking what is going on, from checking statuses and all things that really does not matter. There is a lot of externals that disturbed people focus you know. And be creative, successful or event work smart and control of your own live is an exactly opposite of the taking care about your own web social live all the time. Live without FB, G+, LN, TW, GL.PL is not boring, it is productive again :) . “At last I found my swing”. I was loosing it after taking off me a bunch of my very cool work results, assign that to someone else, and give an award publicly to this person, who not deserve it. I still do not understood how someone can do that. Anyway “giving is opposite of getting” that is all of my lesson I get after all.

Let’s go back to Internet existence. it is 21th century, so if you are not exist on the Internet you are dead :P . So, I left some web sites, this blog and a few of my Internet places still active working, but I left only things I am proud of or even, in my opinion, good enough. So if you want to contact with me, go ahead, I create contact form. And you know what? Nobody of my web social contacts never used it, no one of all my Internet friends missing me, that is the all value of them… I can be hurt, sick, alone, broken, nobody cares, nobody miss… I drop things that is not important. And it is working good. Much more productive to me. Without any of all unnecessary noises I had before. I hope you like my blog entry subjects. .NET is cool, coding is fun and I know exactly what does it mean “Find what you love to work on and until the rest of your live you won’t have to work anymore”. I want to say I like make the design to express by code I created all things I have in mind and that is make me really happy. I think that I cannot do anything different anymore, even imagine this. I changed work place about 3 months ago, it was place where I had so much expectations, things I want to achieve and with expecting promotion I cannot even get. As you can imagine it is not something I can be proud of. But it teach me a lot and I get all the single lessons there, one of the most important was that “job title not describe your vale, only cover your weak, sometimes even incompetence”. From now on, I just want to express myself at work and if I will be working good I will get benefits like money, promotion or more responsibility but, who cares? I want to only express myself by doing great work, in the best way I can. That is count for me now, that is my tao… you know.

Seriously, is that really important to achieve career steps if you cannot work the way you like and with people you trust? I know there is an efficiency that is count, one smart manager I know told me once, that is only one important thing for every manager. Which is getting efficiency results to meet your boss expectations. Other team leader say that important is to lead the way the team grow and do things outside of every team members comfort zone? And that is really count too, to grow. Very often I see and listen someone is afraid, she or he say that cannot make it, she or he worry doing something difficult. And that’s very good and very important and it make a difference. This mean someone is outside of her or his comfort zone and learn a lot in exactly this particular moment. Personally I have so much respect for a meaning of the great quote of M. L. King, doctor King said once “not everybody can be famous, but everybody can be great because greatness is determine by service” and to be honest when I try to lead I only want to serve, help, listen, advice, mentor or coach people I work with. So I probably never be manager I guess. I do not know how to used people I only help sometimes someone to be the best she or he can, that’s all. And I do not sign of someone work to get any kind of award I did not work for. I am not able to steal work results in the way I remember from previous work place you know. So I am on the same job position last five years, that’s ok, that’s my way, that’s my tao… my path to walk, step by step, day by day. I really enjoy it, hope you too.

Take Care, P ;) .

asking for help

Wednesday, May 15, 2013 Posted by

Hi, I send once email to one of the greatest .net podcast producer I have ever met, Carl Franklin who produce .NET Rocks! episodes, you know and I asked If He could help me and record conversation with someone about .NET and OpenAuth2 library implementation and all security staff around those subjects because I dig entire Internet and I could not find any good material to help me understand how can I menage session?, how it works?, how to make sure I used it properly? I am not sure if Carl red my email, because He not answer and because I asked also about very cool .NET Rocks! mug I dream of since listen first time .NET Rocks! episode :) . Anyway I am not sure If He did because of my asking, but after 3 days after my email send, Carl Franklin and Richard Campbell recorded very cool episode of .NET Rocks! Dominick Baier Updates Our Security in .NET 4.5 with all answers for all questions I had. You know I did not receive a mug :P , but that time their really help me I like to believe that it was not accidentally, but because of my asking for help. So Carl and Richard, stars of the Internet :) , helped me, casual coder from small country, in a very cool and valuable way, because I asked for help.

So, is that true? That many people do not asking for help. What do you think? Is below shown man was right?

P ;) .

greatness is determine by service

Sunday, May 12, 2013 Posted by

Hi, I would like to share with you today very cool commencement speech given by Oprah Winfrey. It was in 2008, so it was a long time ago… or like the Bagger Vance said once to the Rannulph Junuh, it was just a moment ago, so please take a look by yourself.

It is a lot of great energy coming from this speech and I noted and find in the Internet two nice quotes. First is Speech to the Young : Speech to the Progress-Toward by Gwendolyn Brooks.

Say to them,
say to the down-keepers,
the sun-slappers,
the self-soilers,
the harmony-hushers,
“even if you are not ready for day
it cannot always be night.”
You will be right.
For that is the hard home-run.

Live not for battles won.
Live not for the-end-of-the-song.
Live in the along.

And second one quote by Martin Luther King Jr., that helps me to understood that me as a coder and designer who creating software can do a kind of service for my customers and I can to help them reach their business golas. Please just read, I hope you know how truly it is.

“Not everybody can be famous but everybody can be great because greatness is determine by service… You only need a heart full of grace and soul generated by love.”

At the end I would like to share commencement speech given again by Oprah Winfrey in 2013, so it was just a moment ago… :)

Do you see the progress? Do you like first, second or both speeches?

P ;) .

new bonsai and fastest binder

Sunday, April 28, 2013 Posted by

imageHi, I am very happy to say that I have new one bonsai tree :) , I know I have them everywhere. This one will be grow up on my desk in my new work place. Reason for having bonsai trees and carry of them is because of my favorite team role that is the Plant and I like plants, especially bonsai trees as you all may already know. I want to say also that acting Plant/Creator role is difficult because I usually have many ideas and of course not all ideas are good. So I always need someone who help me evaluate my ideas for early drop this not useful one and prevent me for analyzing it and building prototype that probably will be only waste of my time. Anyway be Plant is most about putting idea like a plant into the ground and carry of the ideas that can grow. It is another nice aspect of care of small and beautiful tree. I like to say sometimes: “It is very easy to cut bonsai branch and almost impossible to put it back”. So before any change you need to be sure is it correct one or you need to take responsibility of wrong decision and live with that because there is no way back and the same is live. And I wonder have you got interesting hobby with similar quotes come from it? Oh, I almost forget to write about my small big success with KinectCam post that was visited more than 1000 times with 475 downaloads of New.KinectCam :) .

Now after a bit of my philosophy I want to show you a nice way to create very fast Binder class. As you may already know in n-tier applications the user interface layer and the business logic layer are usually loosely connected by binding. And this is very good because binding is done by .NET reflection, so there is no strong connection between your logic class and user interface. Unfortunately binding typically uses property descriptors. So imaging you have following business POCO light state only C# class.

namespace Application.BussinessObjects.Entites
{
    using System;

    [Serializable]
    public class User {
        public string ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EducationDegree { get; set; }
        public string Age { get; set; }
    }
}

It is typical entity that can be loaded and materialized by for example ORM like Entity Framework or NHibernate or even by home made the data access layer that use pure ADO.NET and IDataReader fast forward reader implementation of your favorite database provider. So it come to you and you can bind all properties of the User  class to your user interface using Binder class. It is and it was implemented in WinForms, WPF, WebForms and even ASP.NET MVC. So for example when you use DataBinder from System.Web.dll assembly of .NET 4.0 in the System.Web.UI namespace has following part.

private static bool enableCaching;

public static bool EnableCaching
{
    get
    {
        return DataBinder.enableCaching;
    }
    set
    {
        DataBinder.enableCaching = value;
        if (!value)
        {
            DataBinder.propertyCache.Clear();
        }
    }
}

private readonly static ConcurrentDictionary<Type, PropertyDescriptorCollection>
propertyCache;

internal static PropertyDescriptorCollection GetPropertiesFromCache(object container)
{
    if (!DataBinder.EnableCaching || container is ICustomTypeDescriptor)
    {
        return TypeDescriptor.GetProperties(container);
    }
    else
    {
        PropertyDescriptorCollection properties = null;
        Type type = container.GetType();
        if (!DataBinder.propertyCache.TryGetValue(type, out properties))
        {
            properties = TypeDescriptor.GetProperties(type);
            DataBinder.propertyCache.TryAdd(type, properties);
        }
        return properties;
    }
}

public static object GetPropertyValue(object container, string propName)
{
    if (container != null)
    {
        if (!string.IsNullOrEmpty(propName))
        {
            object value = null;
            PropertyDescriptor propertyDescriptor =
            DataBinder.GetPropertiesFromCache(container).Find(propName, true);
            if (propertyDescriptor == null)
            {
                object[] fullName = new object[]
                { container.GetType().FullName, propName };
                throw new HttpException("DataBinder_Prop_Not_Found");
            }
            else
            {
                value = propertyDescriptor.GetValue(container);
                return value;
            }
        }
        else
        {
            throw new ArgumentNullException("propName");
        }
    }
    else
    {
        throw new ArgumentNullException("container");
    }
}

You can see whole implementation of this class by using the Telerik JustDecompile or the Red-Gate Reflector tool. Anyway it is small powerful class. And in this entry I want to show you how to create much faster implementation using FastMember library that you can get from NuGet. So I do not want to explain you all details of the property descriptors. I want to only write for you that it uses reflection and get it based of the Type class and I hope you see all details clearly. It is not a lot of code, isn’t? Now I will show you two classes and small benchamrk. First one will be WebDataBinder with the same behaviour like it is in build in .NET 4.5 Binder class and second one FastWebDataBinder with using the FastMember library.

namespace Application.BussinessObjects.Common
{
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Web;
    // for FastWebDataBinder
    using FastMember;
    // for Main method benchamerk tests
    using Application.BussinessObjects.Entites;
    using System.Diagnostics;

    public static class WebDataBinder
    {
        private static bool enableCaching;

        public static bool EnableCaching
        {
            get
            {
                return WebDataBinder.enableCaching;
            }
            set
            {
                WebDataBinder.enableCaching = value;
                if (!value)
                {
                    WebDataBinder.propertyCache.Clear();
                }
            }
        }

        private readonly static ConcurrentDictionary<Type, PropertyDescriptorCollection>
        propertyCache = new ConcurrentDictionary<Type, PropertyDescriptorCollection>();

        internal static PropertyDescriptorCollection GetPropertiesFromCache(object container)
        {
            if (!WebDataBinder.EnableCaching || container is ICustomTypeDescriptor)
            {
                return TypeDescriptor.GetProperties(container);
            }
            else
            {
                PropertyDescriptorCollection properties = null;
                Type type = container.GetType();
                if (!WebDataBinder.propertyCache.TryGetValue(type, out properties))
                {
                    properties = TypeDescriptor.GetProperties(type);
                    WebDataBinder.propertyCache.TryAdd(type, properties);
                }
                return properties;
            }
        }

        public static object GetPropertyValue(object container, string propName)
        {
            if (container != null)
            {
                if (!string.IsNullOrEmpty(propName))
                {
                    object value = null;
                    PropertyDescriptor propertyDescriptor
                    = WebDataBinder.GetPropertiesFromCache(container).Find(propName, true);
                    if (propertyDescriptor == null)
                    {
                        object[] fullName = new object[]
                        { container.GetType().FullName, propName };
                        throw new HttpException("DataBinder_Prop_Not_Found");
                    }
                    else
                    {
                        value = propertyDescriptor.GetValue(container);
                        return value;
                    }
                }
                else
                {
                    throw new ArgumentNullException("propName");
                }
            }
            else
            {
                throw new ArgumentNullException("container");
            }
        }
    }

    public static class FastWebDataBinder
    {
        private static bool enableCaching;

        public static bool EnableCaching
        {
            get
            {
                return FastWebDataBinder.enableCaching;
            }
            set
            {
                FastWebDataBinder.enableCaching = value;
                if (!value)
                {
                    FastWebDataBinder.propertyCache.Clear();
                }
            }
        }

        private readonly static ConcurrentDictionary<Type, TypeAccessor>
        propertyCache = new ConcurrentDictionary<Type, TypeAccessor>();

        internal static TypeAccessor GetPropertiesFromCache(object container)
        {
            if (!FastWebDataBinder.EnableCaching || container is ICustomTypeDescriptor)
            {
                return TypeAccessor.Create(container.GetType());
            }
            else
            {
                TypeAccessor typeAccessor;
                Type type = container.GetType();
                if (!FastWebDataBinder.propertyCache.TryGetValue(type, out typeAccessor))
                {
                    typeAccessor = TypeAccessor.Create(type);
                    FastWebDataBinder.propertyCache.TryAdd(type, typeAccessor);
                }
                return typeAccessor;
            }
        }

        public static object GetPropertyValue(object container, string propName)
        {
            if (container != null)
            {
                if (!string.IsNullOrEmpty(propName))
                {
                    object value = null;
                    TypeAccessor typeAccessor
                    = FastWebDataBinder.GetPropertiesFromCache(container);
                    if (typeAccessor == null)
                    {
                        object[] fullName = new object[]
                        { container.GetType().FullName, propName };
                        throw new HttpException("DataBinder_Prop_Not_Found");
                    }
                    else
                    {
                        value = typeAccessor[container, propName];
                        return value;
                    }
                }
                else
                {
                    throw new ArgumentNullException("propName");
                }
            }
            else
            {
                throw new ArgumentNullException("container");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var data = new List<User>();
            for (int p = 0; p < 1000000; ++p)
            {
                data.Add(new User
                {
                    ID = p.ToString(),
                    FirstName = "Piotr" + p,
                    LastName = "Sowa" + p,
                    EducationDegree = "MEng",
                    Age = ((p + 5) % 75).ToString()
                });
            }

            for (int i = 0; i < 10; ++i)
            {
                var meter = Stopwatch.StartNew();
                for (int p = 0; p < 1000000; ++p)
                {
                    var container = data[p];
                    var id = WebDataBinder
                             .GetPropertyValue(container, "ID");
                    var firstName = WebDataBinder
                                    .GetPropertyValue(container, "FirstName");
                    var lastName = WebDataBinder
                                   .GetPropertyValue(container, "LastName");
                    var educationDegree = WebDataBinder
                                          .GetPropertyValue(container, "EducationDegree");
                    var age = WebDataBinder
                              .GetPropertyValue(container, "Age");

                    var expectedId = p.ToString();
                    var expectedFirstName = "Piotr" + p;
                    var expectedLastName = "Sowa" + p;
                    var expectedEducationDegree = "MEng";
                    var expectedAge = ((p + 5) % 75).ToString();

                    var correct
                    = expectedId.Equals(id)
                    && expectedAge.Equals(age)
                    && expectedFirstName.Equals(firstName)
                    && expectedLastName.Equals(lastName)
                    && expectedEducationDegree.Equals(educationDegree);

                    if (!correct)
                    {
                        Console.WriteLine("Error");
                    }
                }
                meter.Stop();
                Console.WriteLine(
                "PropertyDescriptor: 5 millions reads of properties took {0}ms.",
                meter.ElapsedMilliseconds);

                var meterFast = Stopwatch.StartNew();
                for (int p = 0; p < 1000000; ++p)
                {
                    var container = data[p];
                    var id = FastWebDataBinder
                             .GetPropertyValue(container, "ID");
                    var firstName = FastWebDataBinder
                                    .GetPropertyValue(container, "FirstName");
                    var lastName = FastWebDataBinder
                                   .GetPropertyValue(container, "LastName");
                    var educationDegree = FastWebDataBinder
                                          .GetPropertyValue(container, "EducationDegree");
                    var age = FastWebDataBinder
                              .GetPropertyValue(container, "Age");

                    var expectedId = p.ToString();
                    var expectedFirstName = "Piotr" + p;
                    var expectedLastName = "Sowa" + p;
                    var expectedEducationDegree = "MEng";
                    var expectedAge = ((p + 5) % 75).ToString();

                    var correct
                    = expectedId.Equals(id)
                    && expectedAge.Equals(age)
                    && expectedFirstName.Equals(firstName)
                    && expectedLastName.Equals(lastName)
                    && expectedEducationDegree.Equals(educationDegree);
                    if (!correct)
                    {
                        Console.WriteLine("Error");
                    }
                }
                meterFast.Stop();
                Console.WriteLine(
                "FastMember:         5 millions reads of properties took {0}ms.",
                meterFast.ElapsedMilliseconds);
            }

            Console.WriteLine("Press any key to close...");
            Console.ReadKey(true);
        }
    }
}

And here is an output:

PropertyDescriptor: 5 millions reads of properties took 14812ms.
FastMember:         5 millions reads of properties took 1025ms.
PropertyDescriptor: 5 millions reads of properties took 14599ms.
FastMember:         5 millions reads of properties took 1027ms.
PropertyDescriptor: 5 millions reads of properties took 14595ms.
FastMember:         5 millions reads of properties took 993ms.
PropertyDescriptor: 5 millions reads of properties took 14624ms.
FastMember:         5 millions reads of properties took 991ms.
PropertyDescriptor: 5 millions reads of properties took 14567ms.
FastMember:         5 millions reads of properties took 1014ms.
PropertyDescriptor: 5 millions reads of properties took 14632ms.
FastMember:         5 millions reads of properties took 1010ms.
PropertyDescriptor: 5 millions reads of properties took 14618ms.
FastMember:         5 millions reads of properties took 1005ms.
PropertyDescriptor: 5 millions reads of properties took 14612ms.
FastMember:         5 millions reads of properties took 987ms.
PropertyDescriptor: 5 millions reads of properties took 14593ms.
FastMember:         5 millions reads of properties took 1006ms.
PropertyDescriptor: 5 millions reads of properties took 14605ms.
FastMember:         5 millions reads of properties took 1000ms.
Press any key to close...

And another one when I comment out checking if data is correct. Equals function is not very fast also you know.

PropertyDescriptor: 5 millions reads of properties took 14111ms.
FastMember:         5 millions reads of properties took 469ms.
PropertyDescriptor: 5 millions reads of properties took 13826ms.
FastMember:         5 millions reads of properties took 463ms.
PropertyDescriptor: 5 millions reads of properties took 13824ms.
FastMember:         5 millions reads of properties took 464ms.
PropertyDescriptor: 5 millions reads of properties took 13837ms.
FastMember:         5 millions reads of properties took 465ms.
PropertyDescriptor: 5 millions reads of properties took 13844ms.
FastMember:         5 millions reads of properties took 453ms.
PropertyDescriptor: 5 millions reads of properties took 13865ms.
FastMember:         5 millions reads of properties took 456ms.
PropertyDescriptor: 5 millions reads of properties took 13917ms.
FastMember:         5 millions reads of properties took 446ms.
PropertyDescriptor: 5 millions reads of properties took 13815ms.
FastMember:         5 millions reads of properties took 460ms.
PropertyDescriptor: 5 millions reads of properties took 13838ms.
FastMember:         5 millions reads of properties took 463ms.
PropertyDescriptor: 5 millions reads of properties took 13806ms.
FastMember:         5 millions reads of properties took 453ms.
Press any key to close...

And another one when I enabled caching.

PropertyDescriptor: 5 millions reads of properties took 2806ms.
FastMember:         5 millions reads of properties took 465ms.
PropertyDescriptor: 5 millions reads of properties took 2778ms.
FastMember:         5 millions reads of properties took 451ms.
PropertyDescriptor: 5 millions reads of properties took 2806ms.
FastMember:         5 millions reads of properties took 434ms.
PropertyDescriptor: 5 millions reads of properties took 2848ms.
FastMember:         5 millions reads of properties took 445ms.
PropertyDescriptor: 5 millions reads of properties took 2779ms.
FastMember:         5 millions reads of properties took 443ms.
PropertyDescriptor: 5 millions reads of properties took 2770ms.
FastMember:         5 millions reads of properties took 438ms.
PropertyDescriptor: 5 millions reads of properties took 2769ms.
FastMember:         5 millions reads of properties took 439ms.
PropertyDescriptor: 5 millions reads of properties took 2769ms.
FastMember:         5 millions reads of properties took 436ms.
PropertyDescriptor: 5 millions reads of properties took 2806ms.
FastMember:         5 millions reads of properties took 434ms.
PropertyDescriptor: 5 millions reads of properties took 2802ms.
FastMember:         5 millions reads of properties took 439ms.
Press any key to close...

So FastMember library based Binder is almost 30 times faster than classic property descriptor based one:). I know enabled caching helps with property descriptor, but usually we not cache property descriptors for types we want to bind because there are hundreds of them. There is one more thing. in .NET 4.5 reflection was tuned up about 4 times, so imagine that you are using .NET 4.0 based solution, that should increase performance with new binder about 120 times :) . Enjoy!

P ;) .