4Jun/103

Which Is Better Viagra Cialis

Which is better viagra cialis This week I ran into wanting to use C# 4.0 optional parameters, which is better viagra cialis but wanted StructureMap (my IoC tool of choice) to respect the default value specified for those optional parameters.

The Problem

Which is better viagra cialis In this example, which is better viagra cialis we’ll be pulling a command out of the container.  The important part is the optional constructor parameter (level), which is better viagra cialis and it’s default value (Level.Info).

public class LogCommand

{

    IDestination _destination;

    Level _level;

 

    public LogCommand(

        IDestination destination, which is better viagra cialis Level level = Level.Info)

    {

        _destination = destination;

        _level = level;

    }

 

    /* logging code here */

}

 

Which is better viagra cialis Here is your basic usage, which is better viagra cialis but doesn’t work since StructureMap doesn’t know how to take advantage of the optional parameters with default values.

var container = new Container(config =>

{

    config.Scan(scanner =>

    {

        scanner.TheCallingAssembly();

        scanner.AddAllTypesOf<IDestination>();

        scanner.WithDefaultConventions();

    });

});

 

var logCommand = container.GetInstance<LogCommand>();

 

Which is better viagra cialis The last line results in an exception because StructureMap doesn’t know how to fill in the level parameter.

The Solution

Which is better viagra cialis We can solve this by adding a new convention.  One that adds information about default constructor arguments.  Here is the implementation of the convention:

public class DefaultCtorParameterConvention : IRegistrationConvention

{

    public void Process(Type type, which is better viagra cialis Registry registry)

    {

        if(type.IsAbstract || type.IsEnum)

            return;

 

        var ctor = type.GetGreediestCtor();

 

        if(!ctor.HasOptionalParameters())

            return;

 

        var inst = registry.For(type).Use(type);

 

        foreach(var param in ctor.GetOptionalParameters())

            inst.Child(param.Name).Is(param.DefaultValue);

    }

}

Which is better viagra cialis Note: GetGreediestCtor, which is better viagra cialis HasOptionalParameters, which is better viagra cialis and GetOptionalParameters are extension methods.  We’ll see their implementation shortly.

Which is better viagra cialis The convention inherits from the IRegistrationConvention, which is better viagra cialis which is how you implement new conventions in StructureMap.  It has only one method: Process.  We filter out types that are abstract, which is better viagra cialis are enums, which is better viagra cialis or have constructors that don’t have optional parameters.  Once we realize we have a constructor we want to deal with, which is better viagra cialis we use the Child method, which is better viagra cialis that sets either a property or a constructor argument (for our case, which is better viagra cialis it’ll always be a constructor argument), which is better viagra cialis and then we set it’s value to the parameter’s default value, which is better viagra cialis as provided by the ParameterInfo object, which is better viagra cialis for each optional parameter.

Minor Details

Which is better viagra cialis Curious about the implementation of GetGreediestCtor or the *OptionalParameters methods?  If not, which is better viagra cialis skip this section.

public static bool HasOptionalParameters(

    this ConstructorInfo ctor)

{

    return ctor.GetOptionalParameters().Any();

}

 

public static IEnumerable<ParameterInfo> GetOptionalParameters(this ConstructorInfo ctor)

{

    return ctor.GetParameters().Where(

        param => param.Attributes

            .HasFlag(ParameterAttributes.Optional));

}

 

public static ConstructorInfo GetGreediestCtor(

    this Type target)

{

    return target.GetConstructors()

        .WithMax(ctor => ctor.GetParameters().Length);

}

 

public static T WithMax<T>(

    this IEnumerable<T> target, which is better viagra cialis Func<T, which is better viagra cialis int> selector)

{

    int max = -1;

    T currentMax = default(T);

 

    foreach(var item in target)

    {

        var current = selector(item);

        if(current <= max)

            continue;

 

        max = current;

        currentMax = item;

    }

 

    return currentMax;

}

 

Which is better viagra cialis  

The Usage

Which is better viagra cialis Here’s how to use your new convention.

var container = new Container(config =>

{

   config.Scan(scanner =>

   {

       scanner.TheCallingAssembly();

       scanner.AddAllTypesOf<IDestination>();

       scanner.WithDefaultConventions();

       scanner.Convention<DefaultCtorParameterConvention>();

   });

});

 

var logCommand = container.GetInstance<LogCommand>();

 

Which is better viagra cialis Now, which is better viagra cialis when we pull the LogCommand out of the container, which is better viagra cialis the level parameter gets defaulted to Level.Info, which is better viagra cialis just like we specified in the constructor.  Sweet!

Conclusion

Which is better viagra cialis This implementation is somewhat limiting, which is better viagra cialis but the version I have in my github repo is a little more open and configurable.  It allows you to customize the instance key/name you use when registering your type, which is better viagra cialis and also allows you to do additional, which is better viagra cialis non-standard registrations if you need to.

Which is better viagra cialis Also, which is better viagra cialis this doesn’t work if you’ve selected a constructor using the SelectConstructor config API from StructureMap, which is better viagra cialis I’m not sure how to tap into that facility to look for that constructor rather than the greediest.

Which is better viagra cialis Am I missing something?  Did something not make sense?  Leave me a note!

Average Rating: 4.8 out of 5 based on 230 user reviews.

23Sep/091

Drink Alcohol With Viagra

Drink alcohol with viagra The first time I saw autotest (presented by Anthony), drink alcohol with viagra the idea of Continuous Testing captured me.

Drink alcohol with viagra I live in a .NET world most of the time, drink alcohol with viagra and I know of no similar solution for .NET.  It’s been awhile since that first time, drink alcohol with viagra and I’ve tinkered here and there trying to get something comparable, drink alcohol with viagra but usually come up short.  That is until I found watchr.

Drink alcohol with viagra Watchr gave me the file change detection capabilities I needed, drink alcohol with viagra and the extensibility to do whatever I want when a file has been detected as changed.  This made it incredibly easy to hook up some autotest goodness in my .NET world.

Drink alcohol with viagra You'll have to have ruby installed, drink alcohol with viagra and gems.  Then, drink alcohol with viagra the very first thing you'll have to do is

Drink alcohol with viagra gem install watchr --source=http://gemcutter.org

Drink alcohol with viagra Here is my watchr script:

require 'autotest.rb'

watch( '^.*UnitTest.*.cs$' ) do |match|
  run_test(match.to_s)
end

Drink alcohol with viagra This is basically just a regex that says to watch any *.cs files that also contain the string “UnitTest”, drink alcohol with viagra and when it finds a change in a file matching that description, drink alcohol with viagra call run_test with the matched file name.

Drink alcohol with viagra So all the magic is in autotest.rb… lets check it out:

require 'rexml/document'

def build(test_project)
  `msbuild /nologo #{test_project}`
end

def mstest(test_container, drink alcohol with viagra test_results_file, drink alcohol with viagra tests_to_run)
  tests_to_run = ([""] << tests_to_run).flatten

  File.delete(test_results_file) if File.exists?(test_results_file)
  `mstest /nologo /resultsfile:#{test_results_file} /testcontainer:#{test_container} #{tests_to_run.join(" /test:")}`
  test_results = process_mstest_results(test_results_file)
  File.delete(test_results_file) if File.exists?(test_results_file)

  return test_results
end

def process_mstest_results(results_file)
  results = {}
  File.open(results_file) do |file|
    xml = REXML::Document.new(file)

    results[:num_tests] = xml.get_elements("//UnitTestResult").length
    failures = []
    xml.elements.each("//UnitTestResult[@outcome='Failed']") do |e|
      failure = {}
      failure[:message] = e.elements["Output/ErrorInfo/Message"].get_text

      stack = e.elements["Output/ErrorInfo/StackTrace"].get_text.value
      stack_match = /^.*at (.*) in(.*):line (\d+)$/.match(stack)

      failure[:stack] = stack_match[1] if stack_match
      failure[:location] = stack_match[2] if stack_match
      failure[:line] = stack_match[3] if stack_match

      failure[:stack] = stack if !stack_match

      failures << failure
    end
    results[:failures] = failures
  end

  return results
end

def show_results(results)
  puts "#{results[:num_tests]} tests run (#{results[:failures].length} failures)"
  results[:failures].each do |failure|
      puts "---------------------------------------"
      puts "Message: #{failure[:message]}"
      puts "Location: #{failure[:location]}"
      puts "Line: #{failure[:line]}"
      puts "Stack Trace: #{failure[:stack]}"
  end
end

def run_test(file_name)
  test_container = ""
  test_results_file = "result.trx"
  test_project = ""

  system("cls")
  system("echo Detected change in:")
  system("echo   #{file_name}")
  system("echo Building and Testing")

  test_namespace = ''
  test_class = ''
  test_names = []

  File.open(file_name, drink alcohol with viagra "r") do |f|
    f.each do |line|
      ns_match = /^namespace (.*)$/.match(line)
      test_namespace = ns_match[1] if ns_match

      class_match = /^\s*public class (.\w*).*$/.match(line)
      test_class = class_match[1] if class_match

      test_name_match = /^\s*public void (\w*).*$/.match(line)
      test_names << test_name_match[1] if test_name_match
    end
  end

  test_names = test_names.map { |n| "#{test_namespace}.#{test_class}.#{n}" }

  build(test_project)
  results = mstest(test_container, drink alcohol with viagra test_results_file, drink alcohol with viagra test_names)
  show_results(results)
end

Drink alcohol with viagra The key parts (I think) are the fact that I’m using MSTest to run my tests (this can easily be modified to run your framework of choice… note MSTest is not my choice ;) ).  The result parsing is also specific to the MSTest output format, drink alcohol with viagra but should be simple enough for any framework that can output XML. Drink alcohol with viagra Also, drink alcohol with viagra I'm making some assumptions based on my project... Drink alcohol with viagra we've got one unit test project, drink alcohol with viagra so I know I can run tests in a single DLL, drink alcohol with viagra and rebuilding only that project, drink alcohol with viagra I don't have to worry about choosing the correct project and output dll to build and run tests in.

Drink alcohol with viagra To get the thing up and running, drink alcohol with viagra just run

Drink alcohol with viagra watchr <path to watchr script>

Drink alcohol with viagra Please, drink alcohol with viagra use/adapt/give feedback/whatever at will.

Drink alcohol with viagra Go forth and autotest, drink alcohol with viagra .NET comrades!

Average Rating: 4.6 out of 5 based on 211 user reviews.

25Feb/091

Age Of Viagra Users

Age of viagra users I've felt the pain of having the using statement not being able to return a value before, age of viagra users and just chalked it up to a limitation of the language.

Age of viagra users I never considered trying to find a better way, age of viagra users and usually ended up with something like:

void DoSomething()
{
    XmlDocument xml = new XmlDocument();
    using(var reader = new StreamReader(@"c:\somexmlfile.xml"))
    {
        xml.Load(reader);
    }

    // do something useful with xml
}

Age of viagra users or

void DoSomething2()
{
    XmlDocument xml = new XmlDocument();
    using( var reader = new StreamReader( @"c:\somexmlfile.xml" ) )
    {
        xml.Load( reader );
        // do something useful with xml
    }
}

Age of viagra users Neither of which particularly suited me. Age of viagra users Because

  • First example: Declaring the variable outside the scope of the block feels weird
  • Second example: Performing whatever operation inside the using block, age of viagra users means the file (or other resource) doesn't get released until the operation has completed.

Age of viagra users After Shawn mentioned something about this at his Indy Alt.Net Clojure talk, age of viagra users I started thinking about it a little bit, age of viagra users and then I had a real need for it (again), age of viagra users and decided to come up with something better.  Turns out what I wanted was blatantly simple.

TResult UsingReturn(TDisposable toUse, age of viagra users Func func)
    where TDisposable : IDisposable
{
    using (toUse)
    {
        return func(toUse);
    }
}

Age of viagra users Now the above example turns into:

void DoSomething3()
{
    var xml = UsingReturn( new StreamReader( @"c:\cdf.xml" ), age of viagra users reader =>
                {
                    var doc = new XmlDocument();
                    doc.Load( reader );
                    return doc;
                });
}

Age of viagra users I'm not sure where this thing should live (e.g. Age of viagra users some static utility class, age of viagra users extension method on IDisposable), age of viagra users or even what it should be called.  Any ideas?

Average Rating: 4.7 out of 5 based on 271 user reviews.

11Dec/089

Cialis Tablets

Cialis tablets Another bit of magic with static reflection. Cialis tablets Refer to my last post for a little more explanation of static reflection, cialis tablets and a sweet implementation (IMO) of INotifyPropertyChanged using static reflection.

Cialis tablets In the past several years, cialis tablets on several projects, cialis tablets I've seen many lines of code at the beginning of public interface methods that look like:

    public class WebServer
    {
        public void BootstrapServer(int port, cialis tablets string rootDirectory, cialis tablets string serverName)
        {
            if( rootDirectory == null )
            {
                throw new ArgumentNullException( "rootDirectory" );
            }
            if( serverName == null )
            {
                throw new ArgumentNullException( "serverName" );
            }

            // Bootstrap the server
        }
    }

Cialis tablets I realize the need, cialis tablets since we don't have real DbC in .NET (yet), cialis tablets but I REALLY dislike this and feel it to be a pretty bad smell.  It feels unDRY, cialis tablets obscures essence, cialis tablets and I just plain don't like it. Cialis tablets ;)

Cialis tablets So, cialis tablets here is an implementation that makes it tolerable, cialis tablets if not enjoyable (because of the coolness of using static reflection), cialis tablets because I think it actually adds to the essence and overall readability of a given method.

Cialis tablets This is what the above code can now look like:

    public class WebServer
    {
        public void BootstrapServer( int port, cialis tablets string rootDirectory, cialis tablets string serverName )
        {
            Guard.IsNotNull( () => rootDirectory );
            Guard.IsNotNull( () => serverName );

            // Bootstrap the server
        }
    }

Cialis tablets And here is the implementation:

    public static class Guard
    {
        public static void IsNotNull<T>(Expression<Func<T>> expr)
        {
            // expression value != default of T
            if (!expr.Compile()().Equals(default(T)))
                return;

            var param = (MemberExpression) expr.Body;
            throw new ArgumentNullException(param.Member.Name);
        }
    }

Cialis tablets Lovin it!  Hope you do too.

Average Rating: 4.4 out of 5 based on 215 user reviews.

8Dec/087

Buy Cialis Without Prescription

Buy cialis without prescription I'm not going to delve into the definition of static reflection here, buy cialis without prescription but you'll see how it's implemented, buy cialis without prescription and how I found it can help me with implementing INotifyPropertyChanged.

Buy cialis without prescription Now, buy cialis without prescription I've never been a fan of INotifyPropertyChanged myself, buy cialis without prescription mostly because it feels wet (read: not DRY).  I'm working on a WPF app at the moment, buy cialis without prescription and have come to realize, buy cialis without prescription if I embrace INotifyPropertyChanged, buy cialis without prescription I get to take full advantage of the excellent WPF databinding story.

Buy cialis without prescription Here is what a normal use of INotifyPropertyChanged looks like:

    public class Person : INotifyPropertyChanged
    {
        private string _firstName;
        private string _lastName;

        public event PropertyChangedEventHandler PropertyChanged;

        public string FirstName
        {
            get { return _firstName; }
            set
            {
                if (_firstName != value)
                {
                    _firstName = value;
                    FirePropertyChanged("FirstName");
                }
            }
        }

        public string LastName
        {
            get { return _lastName; }
            set
            {
                if (_lastName != value)
                {
                    _lastName = value;
                    FirePropertyChanged("LastName");
                }
            }
        }

        private void FirePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, buy cialis without prescription new PropertyChangedEventArgs(propertyName));
            }
        }
    }

Buy cialis without prescription Here is what the static reflection use of INotifyPropertyChanged looks like:

    public class PersonStaticReflection : NotifyPropertyChanged
    {
        private string _firstName;
        private string _lastName;

        public string FirstName
        {
            get { return _firstName; }
            set { SetProperty(()=> FirstName, buy cialis without prescription ()=> _firstName, buy cialis without prescription value); }
        }

        public string LastName
        {
            get { return _lastName; }
            set
            {
                SetProperty( () => LastName, buy cialis without prescription () => _lastName, buy cialis without prescription value, buy cialis without prescription () =>
                   {
                       // do something useful here
                   });
            }
        }
    }

Buy cialis without prescription Doesn't that just feel DRYer?  It does to me!

Buy cialis without prescription There are several important pieces to note:

  • Inheriting from NotifyPropertyChanged, buy cialis without prescription this is the class that holds the SetProperty method, buy cialis without prescription and hides the static reflection magic.
  • We're calling SetProperty with three arguments in the FirstName property
    • first: a LINQ Expression pointing to the property we're changing
    • second: a LINQ Expression pointing to the field to backing the property
    • third: the new, buy cialis without prescription incoming value
  • We're calling SetProperty with a fourth argument in the LastName property
    • fourth: an action that will get executed only if the values were different
  • Buy cialis without prescription The SetProperty method, buy cialis without prescription is going to look at the current value of the field, buy cialis without prescription and the incoming value.  If the two are different, buy cialis without prescription it will assign the new value to the field, buy cialis without prescription and then fire the NotifyPropertyChanged event, buy cialis without prescription with the name of the property given via the first argument.  I ended up pulling this into its own class so I could use it as the layer supertype in my View Model layer. Buy cialis without prescription Here is the implementation:

    public class NotifyPropertyChanged : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void SetProperty < T>( Expression < Func> propExpr, buy cialis without prescription Expression> fieldExpr, buy cialis without prescription T value )
        {
            SetProperty(propExpr, buy cialis without prescription fieldExpr, buy cialis without prescription value, buy cialis without prescription ()=> { });
        }

        protected void SetProperty < T>( Expression < Func> propExpr, buy cialis without prescription Expression < Func < T>> fieldExpr, buy cialis without prescription T value, buy cialis without prescription Action doIfChanged )
        {
            var prop = (PropertyInfo)((MemberExpression)propExpr.Body).Member;
            var field = (FieldInfo)((MemberExpression)fieldExpr.Body).Member;

            var currVal = prop.GetValue( this, buy cialis without prescription null );

            if( currVal == null && value == null )
                return;
            if( currVal == null || !currVal.Equals( value ) )
            {
                field.SetValue( this, buy cialis without prescription value );
                doIfChanged();

                if( PropertyChanged != null )
                    PropertyChanged( this, buy cialis without prescription new PropertyChangedEventArgs( prop.Name ) );
            }
        }
    }

Buy cialis without prescription Questions/comments/likes/dislikes? Let me know.

Average Rating: 5 out of 5 based on 153 user reviews.

17Sep/081

Is Pfizer Viagra Available In India

Is pfizer viagra available in india Another "tip/trick" style post, is pfizer viagra available in india but thought it may prove useful to someone (or so I can find it again later!)...

Is pfizer viagra available in india Sometimes I find myself needing to map instances/values of one type to another.  For example, is pfizer viagra available in india on my current project we have an enumeration in our communications layer, is pfizer viagra available in india and a VERY similar one in the domain layer.  The reason for this is so we don't have to be referencing the communications layer version all over in the domain code.  So, is pfizer viagra available in india there is naturally a one to one mapping between these enumerations.

Is pfizer viagra available in india Consider the following enumerations:

Is pfizer viagra available in india

enum Polygons
{
    Triangle, is pfizer viagra available in india
    Rectangle, is pfizer viagra available in india
    Pentagon, is pfizer viagra available in india
    Other
}

enum NumSides
{
    Three, is pfizer viagra available in india
    Four, is pfizer viagra available in india
    Five, is pfizer viagra available in india
    More
}

Is pfizer viagra available in india This is the code I usually write to solve this problem:

Is pfizer viagra available in india

private Polygons MapShapes( NumSides sides )
{
    switch( sides )
    {
        case NumSides.Three:
            return Polygons.Triangle;
        case NumSides.Four:
            return Polygons.Rectangle;
        case NumSides.Five:
            return Polygons.Pentagon;
        case NumSides.More:
            return Polygons.Other;
        default:
            throw new NotSupportedException(
                string.Format( "Mapping to Polygons from NumSides value {0}
                    is not supported", is pfizer viagra available in india sides.ToString() ) );
    }
}

private NumSides MapShapes( Polygons polygon )
{
    switch( polygon )
    {
        case Polygons.Triangle:
            return NumSides.Three;
        case Polygons.Rectangle:
            return NumSides.Four;
        case Polygons.Pentagon:
            return NumSides.Five;
        case Polygons.Other:
            return NumSides.More;
        default:
            throw new NotSupportedException(
                string.Format( "Mapping to NumSides from Polygons value {0}
                    is not supported", is pfizer viagra available in india polygon.ToString() ) );
    }
}

Is pfizer viagra available in india It turns out we had 3 said enumerations.  So picture the above, is pfizer viagra available in india copied 3 times.  This thing was just begging for abstraction!

Is pfizer viagra available in india I came up with a Generic (proper) Map class that you can add mappings to and retrieve the corresponding mapped value of the other type... Is pfizer viagra available in india both directions.  Here is the implementation:

Is pfizer viagra available in india

public class Map
{
    private Dictionary _oneToTwo;
    private Dictionary _twoToOne;

    public Map()
    {
        _oneToTwo = new Dictionary();
        _twoToOne = new Dictionary();
    }

    public Map Add( Type1 value1, is pfizer viagra available in india Type2 value2 )
    {
        _oneToTwo.Add( value1, is pfizer viagra available in india value2 );
        _twoToOne.Add( value2, is pfizer viagra available in india value1 );
        return this;
    }

    public Type1 this[Type2 value]
    {
        get
        {
            if( !_twoToOne.ContainsKey( value ) )
            {
                throw new NotSupportedException(
                    string.Format( "Mapping from type {0} to type {1} with
                                    value {2} is not defined", is pfizer viagra available in india
                        typeof( Type2 ).Name, is pfizer viagra available in india
                        typeof( Type1 ).Name, is pfizer viagra available in india
                        value.ToString() ) );
            }
            return _twoToOne[value];
        }
    }

    public Type2 this[Type1 value]
    {
        get
        {
            if( !_oneToTwo.ContainsKey( value ) )
            {
                throw new NotSupportedException(
                    string.Format( "Mapping from type {0} to type {1} with
                                    value {2} is not defined", is pfizer viagra available in india
                        typeof( Type1 ).Name, is pfizer viagra available in india
                        typeof( Type2 ).Name, is pfizer viagra available in india
                        value.ToString() ) );
            }
            return _oneToTwo[value];
        }
    }
}

Is pfizer viagra available in india And, is pfizer viagra available in india here it is in action:

Is pfizer viagra available in india

Map<NumSides, is pfizer viagra available in india Polygons> shapeMap = new Map<NumSides, is pfizer viagra available in india Polygons>()
                                    .Add( NumSides.Three, is pfizer viagra available in india Polygons.Triangle )
                                    .Add( NumSides.Four, is pfizer viagra available in india Polygons.Rectangle )
                                    .Add( NumSides.Five, is pfizer viagra available in india Polygons.Pentagon )
                                    .Add( NumSides.More, is pfizer viagra available in india Polygons.Other );

// shape1 value is Polygons.Rectangle
Polygons shape1 = shapeMap[NumSides.Four]; 

// shape2 value is NumSides.Three
NumSides shape2 = shapeMap[Polygons.Triangle];

Is pfizer viagra available in india This not only works with enumerations, is pfizer viagra available in india but any type.  I see an extension to this possibly allowing for a default mapping, is pfizer viagra available in india and possibly constraining Type1 and Type2 to be IComparable or something like that as well, is pfizer viagra available in india so you can have more control over your matching than whatever the default matching behavior that the Dictionary uses is.

Is pfizer viagra available in india That's it... Is pfizer viagra available in india enjoy!

Average Rating: 4.5 out of 5 based on 234 user reviews.

Tagged as: , 1 Comment
4Sep/084

Viagra Facts

Viagra facts I find myself sometimes wishing I had a better switch/case construct in C#.

Viagra facts My requirements of "better" are:

  • Case statements are automatically scoped
  • I can switch on more than simple types
  • I can have custom logic for my matching criteria

But why not just use if/else if/else...?

Viagra facts Good question, viagra facts I'm glad you asked! However, viagra facts I don't have an excellent answer other than personal preference. Viagra facts if/else if/else is okay sometimes, viagra facts but other times I have a deterministic set of conditions, viagra facts and a switch type construct feels more symmetrical to me. Viagra facts I loves me some symmetric feeling code, viagra facts it just feels cleaner somehow.

Viagra facts So I'll present a somewhat contrived example just so you can see what the usage looks like, viagra facts then we'll see the code.

Usage


public void DoSomething()
{
	object foo = new object();
	object bar = new object();
	object baz = new object();

	Switch<object>.On(baz)
		.Case(x => x.Equals(foo), viagra facts () =>
		{
			Console.WriteLine("came into foo case");
		})
		.Case(x => x.Equals(bar), viagra facts () =>
		{
			Console.WriteLine("came into bar case");
		})
		.Default( () =>
		{
			Console.WriteLine("came into default case");
		})
		.Go();
}

Viagra facts The output from the above, viagra facts is as you'd expect, viagra facts the default case, viagra facts since baz wasn't equal to foo or bar.

Implementation


public class Switch<T>
{
	private T _target;
	private List<KeyValuePair<Predicate<T>, viagra facts Action>> _cases;
	private Action _default;

	public static Switch<T> On(T target)
	{
		return new Switch<T>(target);
	}

	public Switch(T target)
	{
		_target = target;
		_cases = new List<KeyValuePair<Predicate<T>, viagra facts Action>>();
	}

	public Switch<T> Case(Predicate<T> @case, viagra facts Action action)
	{
		_cases.Add(new KeyValuePair<Predicate<T>, viagra facts Action>(@case, viagra facts action));
		return this;
	}

	public Switch<T> Default(Action action)
	{
		_default = action;
		return this;
	}

	public void Go()
	{
		foreach(var @case in _cases)
			if (@case.Key(_target))
			{
				@case.Value();
				return;
			}
		if (_default != null)
			_default();
	}
}

Viagra facts The only part I don't really like is having to kick it off with the Go() at the end. Viagra facts Any ideas for a better way to kick it off, viagra facts or at least a better name for it (instead of Go).

Viagra facts Feedback? Ideas?

Update

Viagra facts Paul had a great idea a couple great ideas (see comments) on how to get rid of the Go() at the end, viagra facts and to force Default to only appear at the end. Viagra facts Here is the new implementation. Viagra facts Usage is the same, viagra facts just remove the Go().


public class Switch<T>
{
	private T _target;
	private bool _alreadyMatched;

	public static Switch<T> On(T target)
	{
		return new Switch<T>(target);
	}

	public Switch(T target)
	{
		_target = target;
		_alreadyMatched = false;
	}

	public Switch<T> Case(Predicate<T> @case, viagra facts Action action)
	{
		if (!_alreadyMatched && @case(_target))
		{
			_alreadyMatched = true;
			action();
		}
		return this;
	}

	public void Default(Action action)
	{
		if (!_alreadyMatched)
		{
			_alreadyMatched = true;
			action();
		}
		return this;
	}
}

Average Rating: 5 out of 5 based on 201 user reviews.

Tagged as: , 4 Comments
26Aug/080

Online Doctor Viagra

Online doctor viagra Starting my new project in a new role, online doctor viagra as project lead, online doctor viagra I need to be managing things in TFS.  The UI for batching these things up is nonexistent, online doctor viagra but there is Excel integration so you can do it all in Excel, online doctor viagra hit save, online doctor viagra and it all goes back to the TFS server... Online doctor viagra pretty slick I must say (I was actually in the midst of writing such a tool when I realized this functionality already existed OOB).

Online doctor viagra However, online doctor viagra the first time I tried to use this functionality... Online doctor viagra BLAM, online doctor viagra I get smacked with this:

Online doctor viagra TF80042: The document cannot be opened because you do not have Microsoft Excel 2003 or later, online doctor viagra or one of its components installed. Online doctor viagra For more information, online doctor viagra see the Team Foundation Installation Guide.

Online doctor viagra Isn't that teh suck?

Online doctor viagra Anyways, online doctor viagra there is a sweet write-up on how to fix it here: http://blogs.microsoft.co.il/blogs/srlteam/archive/2007/07/17/Error-when-trying-to-export-queries-to-Excel.aspx.

Online doctor viagra Thanks Elad!

Average Rating: 4.4 out of 5 based on 178 user reviews.

Tagged as: , , No Comments
22Aug/081

Cheepest Cialis

Cheepest cialis So last night I gave a talk at Indy ALT.NET on Castle MonoRail.  It was really just a sort of intro to MonoRail type of deal, cheepest cialis but the cool part was that we held a Dojo after I got done jabbering.

Cheepest cialis We ended up building a Poll Generator for our dojo activity.  We almost got done in the 45 minutes or so that we dojo'd.  It was a pretty fun activity, cheepest cialis and I'd like to do it again sometime soon.

Cheepest cialis Also, cheepest cialis this was really my first public speaking engagement to our technical community, cheepest cialis and let me say it was a blast.  Everyone had great things to say, cheepest cialis and many great questions were asked too.

Cheepest cialis I set up a google code repository so you can grab my slidedeck and grab the source for our dojo activity and my demo app.

Cheepest cialis Maybe next time I'll post before the talk, cheepest cialis so I can let people know about it.

Cheepest cialis Thanks guys for all the great feedback, cheepest cialis and thanks to my wife for understanding why I wasn't spending any of my evenings with her this week!

Average Rating: 4.7 out of 5 based on 292 user reviews.

22Aug/080

Viagra Femele

Viagra femele Wowza!  So I've begun reading LosTechies (tons of great content, viagra femele highly recommended!), viagra femele and came across a passage today from Jimmy Bogard, viagra femele who says what I feel, viagra femele but what I couldn't get out of my head:

Viagra femele On a sidenote, viagra femele it always bothered me when people say that an interface with one implementation is a design smell.  No, viagra femele an interface is used to expose a contract.  Interfaces communicate design intent, viagra femele far better than a class might.

Viagra femele Exactly!

Average Rating: 4.8 out of 5 based on 238 user reviews.

Tagged as: , No Comments