Click here to Skip to main content
Click here to Skip to main content

C# Universal String Parsing Utility

By , 10 Aug 2012
 

The Problem

Parsing strings into other objects using tryParse() is a pain, and results in ugly code. I was sick and tired of seeing this kind of thing all over my projects:

var someStringThatShouldBeAnInt = "10";
int i = 0;
if(int.TryParse(someStringThatShouldBeAnInt, out i))
{
    //Continue on with things
}else
{
    //Complain about it
} 

The Desired Solution 

Abstract this ugliness and replace it with something like this: 

var someStringThatShouldBeAnInt = "10";
var i = someStringThatShouldBeAnInt.Parse<int>();

The How

Seems like if I could dynamically call the tryParse() using Reflection I could write this once for every type that has the tryParse() available to it.

public static T Parse<T>(this string thingToParse)
{
    var retType = typeof(T);
    var tParse = retType.GetMethod("TryParse",
                                   BindingFlags.Public | BindingFlags.Static, null,
                                   new[] { typeof(string), retType.MakeByRefType() }, null);

    if (tParse != null)
    {
        var parameters = new object[] { thingToParse, null };
        var success = (bool)tParse.Invoke(null, parameters);
        if (success)
        {
            return (T)parameters[1];
        }
    }

    return default(T);
}

What If the type you are converting to doesn't implement tryParse()?

var csv = "1,2,3,4,5,6,7";
var list = csv.Parse<List<string>>();

Yea that’s not going to work. So let's give you the option to pass in your own converter.

public static T Parse<T>(this string thingToParse, Func<string, T> parser)
{
    return parser.Invoke(thingToParse);
}

Wow that’s even cleaner. Now we can do the following:

var csv = "1,2,3,4,5,6,7";
var list = csv.Parse<List<string>>(x => x.Split(',').ToList());

Yea that’s clean.

If you find this useful or see ways to improve please feel free to comment.

You can also find some other great topics over at my blog at: http://www.sympletech.com.

This utility can be found with many others here: https://github.com/sympletech/SympleLib.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Sympletech
Software Developer Sympletech
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 1memberClifford Nelson6 Aug '12 - 7:49 
QuestionSorry, no vote from mememberThorsten Bruning4 Aug '12 - 7:05 
QuestionThanks All for the feedback.memberSympletech3 Aug '12 - 18:31 
GeneralMy vote of 3memberBillWoodruff3 Aug '12 - 12:09 
Questionmy vote of #3, and one "editorial suggestion"memberBillWoodruff3 Aug '12 - 12:08 
GeneralMy vote of 4memberIan Shlasko3 Aug '12 - 10:54 
GeneralMy vote of 4memberChristian Amado3 Aug '12 - 9:42 
AnswerNot enough content for articlememberClifford Nelson3 Aug '12 - 8:34 
AnswerRe: Not enough content for articlememberClifford Nelson6 Aug '12 - 7:51 
GeneralRe: Not enough content for articlememberCIDev10 Aug '12 - 10:17 
GeneralRe: Not enough content for articlememberSympletech10 Aug '12 - 10:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130523.1 | Last Updated 10 Aug 2012
Article Copyright 2012 by Sympletech
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid