Julien-Bernard

MethodConverter

Oct 15th, 2023
959
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.23 KB | None | 0 0
  1.     public class MethodConverter : MarkupExtension
  2.     {
  3.         public MethodConverter()
  4.         {
  5.         }
  6.  
  7.         public string Path { get; set; } = "";
  8.  
  9.         public string Method { get; set; } = "";
  10.  
  11.         public override object ProvideValue(IServiceProvider serviceProvider)
  12.         {
  13.             var binding = new ReflectionBindingExtension(Path)
  14.             {
  15.                 Mode = BindingMode.OneWay,
  16.                 Converter = new FuncValueConverter<object, object?>(e =>
  17.                 {
  18.                     if (e == null) { return $"Converter extension error - null element"; }
  19.                     Type? objectType = e.GetType();
  20.  
  21.                     MethodInfo? methodInfo = objectType?.GetMethod(Method);
  22.                     if (methodInfo != null) {
  23.                         if (methodInfo.GetParameters().Length != 0) { return $"Converter extension error - method {Method} takes parameters"; }
  24.                         return methodInfo.Invoke(e, new object[] { });
  25.                     }
  26.  
  27.                     var extensionMethods = AppDomain.CurrentDomain.GetAssemblies().ToList()
  28.                         .SelectMany(assembly => assembly.GetTypes())
  29.                         .Where(type => type.IsSealed && !type.IsGenericType && !type.IsNested)
  30.                         .SelectMany(type => type.GetMethods(BindingFlags.Static | BindingFlags.Public))
  31.                         .Where(method => method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) && method.GetParameters()[0].ParameterType == objectType);
  32.                     var suitableExtensionMethod = extensionMethods.First(method => method.Name == Method);
  33.                     if (suitableExtensionMethod != null)
  34.                     {
  35.                         if (suitableExtensionMethod.GetParameters().Length != 1) { return $"Converter extension error - extension method {Method} takes parameters"; }
  36.                         return suitableExtensionMethod.Invoke(null, new object[] { e });
  37.                     }
  38.  
  39.                     return $"Converter extension error - method {Method} unresolved for type {objectType}";
  40.                 })
  41.             };
  42.  
  43.             return binding.ProvideValue(serviceProvider);
  44.         }
  45.     }
  46.  
Advertisement
Add Comment
Please, Sign In to add comment