Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nullable int always set to 0? #49

Closed
StefH opened this issue Aug 20, 2017 · 5 comments
Closed

nullable int always set to 0? #49

StefH opened this issue Aug 20, 2017 · 5 comments

Comments

@StefH
Copy link
Collaborator

StefH commented Aug 20, 2017

  [ValueArgument(typeof(int), "MaxRequestLogCount", Optional = true, DefaultValue = null)]
  public int? MaxRequestLogCount { get; set; }

When not providing this argument, the default value is set to 0 instead of null ? Do I miss something?

And typeof(int?) crashes ?

  [ValueArgument(typeof(int?), "MaxRequestLogCount", Optional = true, DefaultValue = null)]
  public int? MaxRequestLogCount { get; set; }
@j-maly
Copy link
Owner

j-maly commented Aug 20, 2017

[ValueArgument(typeof(int))] - I am surprised that this does not crash.
property.SetValue(null) where property is of type int.... weird

But this

[ValueArgument(typeof(int?), "MaxRequestLogCount", Optional = true, DefaultValue = null)]
public int? MaxRequestLogCount { get; set; }

seem to work fine for me. And isn't DefaultValue=null redundant?

@StefH
Copy link
Collaborator Author

StefH commented Aug 20, 2017

Maybe it's just Net Core 2.0 related???

See https://github.com/WireMock-Net/WireMock.Net/tree/master/examples/WireMock.Net.StandAlone.NETCoreApp

And the command is:
dotnet run -f netcoreapp2.0 --MaxRequestLogCount 100

The error is like:

Type System.Nullable`1[System.Int32] of argument 100 is not a built-in type.Set ConvertValueHandler to a conversion routine for this type or define static method Parse(string stringValue, Cu
ltureInfo cultureInfo) that can Parse your type from string.

Usage:
        --Port[optional]... Port to listen on.

        --Urls[optional]... URL(s) to listen on.

        --AllowPartialMapping[optional]... Allow Partial Mapping (default set to false).

        --StartAdminInterface[optional]... Start the AdminInterface (default set to true).

        --ReadStaticMappings[optional]... Read StaticMappings from ./__admin/mappings (default set to true).

        --ProxyURL[optional]... The ProxyURL to use.

        --SaveProxyMapping[optional]... Save the proxied request and response mapping files in ./__admin/mappings.  (default set to true).

        --X509Certificate2ThumbprintOrSubjectName[optional]... The X509Certificate2 Thumbprint or SubjectName to use.

        --AdminUsername[optional]... The username needed for __admin access.

        --AdminPassword[optional]... The password needed for __admin access.

        --RequestLogExpirationDuration[optional]... The RequestLog expiration in hours (optional).

        --MaxRequestLogCount[optional]... The MaxRequestLog count (optional).



Unhandled Exception: CommandLineParser.Exceptions.InvalidConversionException: Type System.Nullable`1[System.Int32] of argument 100 is not a built-in type.Set ConvertValueHandler to a convers
ion routine for this type or define static method Parse(string stringValue, CultureInfo cultureInfo) that can Parse your type from string.
   at CommandLineParser.Arguments.ValueArgument`1.DefaultConvert(String stringValue)
   at CommandLineParser.Arguments.ValueArgument`1.Convert(String stringValue)
   at CommandLineParser.Arguments.ValueArgument`1.Parse(IList`1 args, Int32& i)
   at CommandLineParser.CommandLineParser.ParseCommandLine(String[] args)
   at WireMock.Net.StandAlone.StandAloneApp.Start(String[] args) in C:\Users\StefHeyenrath\Documents\GitHub\WireMock.Net\src\WireMock.Net.StandAlone\StandAloneApp.cs:line 146
   at WireMock.Net.StandAlone.NETCoreApp.Program.Main(String[] args) in C:\Users\StefHeyenrath\Documents\GitHub\WireMock.Net\examples\WireMock.Net.StandAlone.NETCoreApp\Program.cs:line 14

@j-maly
Copy link
Owner

j-maly commented Aug 20, 2017 via email

@StefH StefH changed the title nullable int alweys set to 0? nullable int always set to 0? Aug 21, 2017
@StefH
Copy link
Collaborator Author

StefH commented Aug 21, 2017

I doubt if this is Net Core 2.0 related, actually I think that this code (

MethodInfo mi = typeof(TValue).GetMethod("Parse", new [] { typeof(string), typeof(CultureInfo)});
) cannot work if it's a Nullable type.

I think you need this code:

if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    valueType = Nullable.GetUnderlyingType(valueType);
}
MethodInfo mi = valueType.GetMethod("Parse", new [] { typeof(string), typeof(CultureInfo)});
if (mi != null)
{
  if (mi.IsStatic && mi.ReturnType == valueType)
  {
    return stringValue != null ? (TValue)mi.Invoke(null, new object[] { stringValue, _cultureInfo }) : null;
  }
}

See my example at:
https://github.com/WireMock-Net/WireMock.Net-docker/blob/master/CommandLineParserTest/Program.cs#L16-L19

Also verify for null:
https://github.com/WireMock-Net/WireMock.Net-docker/blob/master/CommandLineParserTest/Program.cs#L46

@StefH
Copy link
Collaborator Author

StefH commented Aug 22, 2017

Should I make a PR + unit-tests for this issue?

@j-maly j-maly closed this as completed in 44a6a65 Aug 22, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants