using System;
using System.Collections.Generic;
public static class GenericParser
{
//create a delegate which our parsers will use
private delegate bool Parser(string source, out object result);
//This is the list of our parsers
private static readonly List<Parser> Parsers = new List<Parser>
{
new Parser(ParseInt),
new Parser(ParseDouble),
new Parser(ParseBool),
new Parser(ParseString)
};
public static object Parse(string source)
{
object result;
foreach (Parser parser in Parsers)
{
//return the result if the parser succeeded.
if (parser(source, out result))
return result;
}
//return null if all of the parsers failed (should never happen because the string->string parser can't fail.)
return null;
}
private static bool ParseInt(string source, out object result)
{
int tmp;
bool success = int.TryParse(source, out tmp);
result = tmp;
return success;
}
private static bool ParseDouble(string source, out object result)
{
double tmp;
bool success = double.TryParse(source, out tmp);
result = tmp;
return success;
}
private static bool ParseBool(string source, out object result)
{
bool tmp;
bool success = bool.TryParse(source, out tmp);
result = tmp;
return success;
}
private static bool ParseString(string source, out object result)
{
result = source;
return true;
}
}
public class Test
{
static void Main(string[] args)
{
TestString("2");
TestString("2.0");
TestString("true");
TestString("nnn");
}
static void TestString(string testString)
{
object result = GenericParser.Parse(testString);
Console.WriteLine("\"{0}\"\t => {1}", testString, result.GetType().Name);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNQYXJzZXIKICAgIHsKICAgICAgICAvL2NyZWF0ZSBhIGRlbGVnYXRlIHdoaWNoIG91ciBwYXJzZXJzIHdpbGwgdXNlIAogICAgICAgIHByaXZhdGUgZGVsZWdhdGUgYm9vbCBQYXJzZXIoc3RyaW5nIHNvdXJjZSwgb3V0IG9iamVjdCByZXN1bHQpOwoKICAgICAgICAvL1RoaXMgaXMgdGhlIGxpc3Qgb2Ygb3VyIHBhcnNlcnMKICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMaXN0PFBhcnNlcj4gUGFyc2VycyA9IG5ldyBMaXN0PFBhcnNlcj4KICAgICAgICB7CiAgICAgICAgICAgIG5ldyBQYXJzZXIoUGFyc2VJbnQpLAogICAgICAgICAgICBuZXcgUGFyc2VyKFBhcnNlRG91YmxlKSwKICAgICAgICAgICAgbmV3IFBhcnNlcihQYXJzZUJvb2wpLAogICAgICAgICAgICBuZXcgUGFyc2VyKFBhcnNlU3RyaW5nKQogICAgICAgIH07CgogICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IFBhcnNlKHN0cmluZyBzb3VyY2UpCiAgICAgICAgewogICAgICAgICAgICBvYmplY3QgcmVzdWx0OwogICAgICAgICAgICBmb3JlYWNoIChQYXJzZXIgcGFyc2VyIGluIFBhcnNlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoZSByZXN1bHQgaWYgdGhlIHBhcnNlciBzdWNjZWVkZWQuCiAgICAgICAgICAgICAgICBpZiAocGFyc2VyKHNvdXJjZSwgb3V0IHJlc3VsdCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9yZXR1cm4gbnVsbCBpZiBhbGwgb2YgdGhlIHBhcnNlcnMgZmFpbGVkIChzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgdGhlIHN0cmluZy0+c3RyaW5nIHBhcnNlciBjYW4ndCBmYWlsLikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFBhcnNlSW50KHN0cmluZyBzb3VyY2UsIG91dCBvYmplY3QgcmVzdWx0KQogICAgICAgIHsKICAgICAgICAgICAgaW50IHRtcDsKICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gaW50LlRyeVBhcnNlKHNvdXJjZSwgb3V0IHRtcCk7CiAgICAgICAgICAgIHJlc3VsdCA9IHRtcDsKICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFBhcnNlRG91YmxlKHN0cmluZyBzb3VyY2UsIG91dCBvYmplY3QgcmVzdWx0KQogICAgICAgIHsKICAgICAgICAgICAgZG91YmxlIHRtcDsKICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gZG91YmxlLlRyeVBhcnNlKHNvdXJjZSwgb3V0IHRtcCk7CiAgICAgICAgICAgIHJlc3VsdCA9IHRtcDsKICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFBhcnNlQm9vbChzdHJpbmcgc291cmNlLCBvdXQgb2JqZWN0IHJlc3VsdCkKICAgICAgICB7CiAgICAgICAgICAgIGJvb2wgdG1wOwogICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBib29sLlRyeVBhcnNlKHNvdXJjZSwgb3V0IHRtcCk7CiAgICAgICAgICAgIHJlc3VsdCA9IHRtcDsKICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFBhcnNlU3RyaW5nKHN0cmluZyBzb3VyY2UsIG91dCBvYmplY3QgcmVzdWx0KQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGNsYXNzIFRlc3QKICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBUZXN0U3RyaW5nKCIyIik7CiAgICAgICAgICAgIFRlc3RTdHJpbmcoIjIuMCIpOwogICAgICAgICAgICBUZXN0U3RyaW5nKCJ0cnVlIik7CiAgICAgICAgICAgIFRlc3RTdHJpbmcoIm5ubiIpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIHZvaWQgVGVzdFN0cmluZyhzdHJpbmcgdGVzdFN0cmluZykKICAgICAgICB7CiAgICAgICAgICAgIG9iamVjdCByZXN1bHQgPSBHZW5lcmljUGFyc2VyLlBhcnNlKHRlc3RTdHJpbmcpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiXCJ7MH1cIlx0ID0+IHsxfSIsIHRlc3RTdHJpbmcsIHJlc3VsdC5HZXRUeXBlKCkuTmFtZSk7CiAgICAgICAgfQogICAgfQ==