mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
647db9635a
* Renaming Microsoft.Agent.Workflows to Microsoft.Agents.AI.Workflows * Removing local settings. * Removing remining old files from merge.
55 lines
2.3 KiB
C#
55 lines
2.3 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Reflection;
|
|
|
|
#if !NET
|
|
using System.Linq;
|
|
#endif
|
|
|
|
namespace Microsoft.Agents.AI.Workflows.Reflection;
|
|
|
|
internal static class ReflectionDemands
|
|
{
|
|
internal const DynamicallyAccessedMemberTypes ReflectedMethods = DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods;
|
|
internal const DynamicallyAccessedMemberTypes ReflectedInterfaces = DynamicallyAccessedMemberTypes.Interfaces;
|
|
|
|
internal const DynamicallyAccessedMemberTypes RuntimeInterfaceDiscoveryAndInvocation = ReflectedMethods | ReflectedInterfaces;
|
|
}
|
|
|
|
internal static class ReflectionExtensions
|
|
{
|
|
public static object? ReflectionInvoke(this MethodInfo method, object? target, params object?[] arguments)
|
|
{
|
|
#if NET
|
|
return method.Invoke(target, BindingFlags.DoNotWrapExceptions, binder: null, arguments, culture: null);
|
|
#else
|
|
try
|
|
{
|
|
return method.Invoke(target, BindingFlags.Default, binder: null, arguments, culture: null);
|
|
}
|
|
catch (TargetInvocationException e) when (e.InnerException is not null)
|
|
{
|
|
// If we're targeting .NET Framework, such that BindingFlags.DoNotWrapExceptions
|
|
// is ignored, the original exception will be wrapped in a TargetInvocationException.
|
|
// Unwrap it and throw that original exception, maintaining its stack information.
|
|
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
|
|
throw;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public static MethodInfo GetMethodFromGenericMethodDefinition(this Type specializedType, MethodInfo genericMethodDefinition)
|
|
{
|
|
Debug.Assert(specializedType.IsGenericType && specializedType.GetGenericTypeDefinition() == genericMethodDefinition.DeclaringType, "generic member definition doesn't match type.");
|
|
#if NET
|
|
return (MethodInfo)specializedType.GetMemberWithSameMetadataDefinitionAs(genericMethodDefinition);
|
|
#else
|
|
const BindingFlags All = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
|
|
return specializedType.GetMethods(All).First(m => m.MetadataToken == genericMethodDefinition.MetadataToken);
|
|
#endif
|
|
}
|
|
}
|