Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
2 changes: 1 addition & 1 deletion ReflectorNet/ReflectorNet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<!-- NuGet Package Information -->
<PackageId>com.IvanMurzak.ReflectorNet</PackageId>
<Version>2.3.1</Version>
<Version>2.3.2</Version>
<Authors>Ivan Murzak</Authors>
<Copyright>Copyright © Ivan Murzak 2025</Copyright>
<Description>ReflectorNet is an advanced .NET reflection toolkit designed for AI-driven scenarios. Effortlessly search for C# methods using natural language queries, invoke any method by supplying arguments as JSON, and receive results as JSON. The library also provides a powerful API to inspect, modify, and manage in-memory object instances dynamically via JSON data. Ideal for automation, testing, and AI integration workflows.</Description>
Expand Down
40 changes: 6 additions & 34 deletions ReflectorNet/src/Reflector/MethodWrapper.Static.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;
using Microsoft.Extensions.Logging;

Expand All @@ -8,42 +7,15 @@ public partial class MethodWrapper
{
public static MethodWrapper Create(Reflector reflector, ILogger? logger, MethodInfo methodInfo)
{
if (methodInfo.IsStatic)
return new MethodWrapper(reflector, logger, methodInfo);
else
return new MethodWrapper(reflector, logger, methodInfo.DeclaringType!, methodInfo);
return methodInfo.IsStatic
? new MethodWrapper(reflector, logger, methodInfo)
: new MethodWrapper(reflector, logger, methodInfo.DeclaringType!, methodInfo);
}
public static MethodWrapper CreateFromInstance(Reflector reflector, ILogger? logger, object targetInstance, MethodInfo methodInfo)
{
if (methodInfo.IsStatic)
return new MethodWrapper(reflector, logger, methodInfo);
else
return new MethodWrapper(reflector, logger, targetInstance, methodInfo);
}

private static object? ConvertStringToEnum(object? value, Type parameterType, string parameterName)
{
if (value is string stringValue && parameterType.IsEnum)
{
if (Enum.TryParse(parameterType, stringValue, ignoreCase: true, out var result))
{
if (Enum.IsDefined(parameterType, result!))
{
return result;
}
else
{
throw new ArgumentException(
$"Value '{stringValue}' for parameter '{parameterName}' was parsed but is not a defined member of '{parameterType.GetTypeName(pretty: true)}'. Valid values are: {string.Join(", ", Enum.GetNames(parameterType))}");
}
}
else
{
throw new ArgumentException(
$"Value '{stringValue}' for parameter '{parameterName}' could not be parsed as '{parameterType.GetTypeName(pretty: true)}'. Valid values are: {string.Join(", ", Enum.GetNames(parameterType))}");
}
}
throw new ArgumentException($"Parameter '{parameterName}' type mismatch. Expected '{parameterType.GetTypeName(pretty: true)}', but got '{value?.GetType()}'.");
return methodInfo.IsStatic
? new MethodWrapper(reflector, logger, methodInfo)
: new MethodWrapper(reflector, logger, targetInstance, methodInfo);
}
}
}
10 changes: 5 additions & 5 deletions ReflectorNet/src/Reflector/MethodWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ public partial class MethodWrapper
protected readonly JsonNode? _inputSchema;
protected readonly JsonNode? _outputSchema;

public virtual JsonNode? InputSchema => _inputSchema;
public virtual JsonNode? OutputSchema => _outputSchema;
public virtual string? Description => _description;
public JsonNode? InputSchema => _inputSchema;
public JsonNode? OutputSchema => _outputSchema;
public string? Description => _description;

public MethodWrapper(Reflector reflector, ILogger? logger, MethodInfo methodInfo)
{
Expand Down Expand Up @@ -307,7 +307,7 @@ public virtual bool VerifyParameters(IReadOnlyDictionary<string, object?>? named
if (underlyingType.IsEnum)
{
// Handle enum conversion for string values and return the provided parameter value
return ConvertStringToEnum(value, underlyingType, methodParameter.Name!);
return StringUtils.ConvertParameterStringToEnum(value, underlyingType, methodParameter.Name!);
}

throw new ArgumentException($"Parameter '{methodParameter.Name}' type mismatch. Expected '{methodParameter.ParameterType.GetTypeName(pretty: true)}', but got '{value?.GetType()}'.");
Expand Down Expand Up @@ -391,7 +391,7 @@ public virtual bool VerifyParameters(IReadOnlyDictionary<string, object?>? named
if (underlyingType.IsEnum)
{
// Handle enum conversion for string values and return the provided parameter value
return ConvertStringToEnum(value, underlyingType, parameter.Name!);
return StringUtils.ConvertParameterStringToEnum(value, underlyingType, parameter.Name!);
}

throw new ArgumentException($"Parameter '{parameter.Name}' type mismatch. Expected '{parameter.ParameterType.GetTypeName(pretty: true)}', but got '{value?.GetType()}'.");
Expand Down
24 changes: 24 additions & 0 deletions ReflectorNet/src/Utils/StringUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,29 @@ public static bool Path_ParseParent(string? path, out string? parentPath, out st
? span.Slice(lastSlashIndex + 1).ToString()
: span.ToString();
}
public static object? ConvertParameterStringToEnum(object? value, Type enumType, string parameterName)
{
if (value is string stringValue && enumType.IsEnum)
{
if (Enum.TryParse(enumType, stringValue, ignoreCase: true, out var result))
{
if (Enum.IsDefined(enumType, result!))
{
return result;
}
else
{
throw new ArgumentException(
$"Value '{stringValue}' for parameter '{parameterName}' was parsed but is not a defined member of '{enumType.GetTypeName(pretty: true)}'. Valid values are: {string.Join(", ", Enum.GetNames(enumType))}");
}
}
else
{
throw new ArgumentException(
$"Value '{stringValue}' for parameter '{parameterName}' could not be parsed as '{enumType.GetTypeName(pretty: true)}'. Valid values are: {string.Join(", ", Enum.GetNames(enumType))}");
}
}
throw new ArgumentException($"Parameter '{parameterName}' type mismatch. Expected '{enumType.GetTypeName(pretty: true)}', but got '{value?.GetType()}'.");
}
}
}