Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class MethodConverter : MarkupExtension
- {
- public MethodConverter()
- {
- }
- public string Path { get; set; } = "";
- public string Method { get; set; } = "";
- public override object ProvideValue(IServiceProvider serviceProvider)
- {
- var binding = new ReflectionBindingExtension(Path)
- {
- Mode = BindingMode.OneWay,
- Converter = new FuncValueConverter<object, object?>(e =>
- {
- if (e == null) { return $"Converter extension error - null element"; }
- Type? objectType = e.GetType();
- MethodInfo? methodInfo = objectType?.GetMethod(Method);
- if (methodInfo != null) {
- if (methodInfo.GetParameters().Length != 0) { return $"Converter extension error - method {Method} takes parameters"; }
- return methodInfo.Invoke(e, new object[] { });
- }
- var extensionMethods = AppDomain.CurrentDomain.GetAssemblies().ToList()
- .SelectMany(assembly => assembly.GetTypes())
- .Where(type => type.IsSealed && !type.IsGenericType && !type.IsNested)
- .SelectMany(type => type.GetMethods(BindingFlags.Static | BindingFlags.Public))
- .Where(method => method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) && method.GetParameters()[0].ParameterType == objectType);
- var suitableExtensionMethod = extensionMethods.First(method => method.Name == Method);
- if (suitableExtensionMethod != null)
- {
- if (suitableExtensionMethod.GetParameters().Length != 1) { return $"Converter extension error - extension method {Method} takes parameters"; }
- return suitableExtensionMethod.Invoke(null, new object[] { e });
- }
- return $"Converter extension error - method {Method} unresolved for type {objectType}";
- })
- };
- return binding.ProvideValue(serviceProvider);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment