C#: Возвратите делегата, учитывая объект и имя метода

Вы должны обернуть возвращаемый компонент вместо функции HOC:

const withLoader = (loadingProp) => (WrappedComponent) => {
  return withStyles(styles)(class LoadIndicator extends Component {

    render() {

      return <h1>hello world</h1>
    }
  }}
}

export default (withLoader)
8
задан Austin Salonen 23 April 2009 в 19:07
поделиться

3 ответа

Вам потребуется использовать Type.GetMethod , чтобы получить правильный метод, и Delegate.CreateDelegate для преобразования MethodInfo в делегат. Полный пример:

using System;
using System.Reflection;

delegate string MyDelegate();

public class Dummy
{
    public override string ToString()
    {
        return "Hi there";
    }
}

public class Test
{
    static MyDelegate GetByName(object target, string methodName)
    {
        MethodInfo method = target.GetType()
            .GetMethod(methodName, 
                       BindingFlags.Public 
                       | BindingFlags.Instance 
                       | BindingFlags.FlattenHierarchy);

        // Insert appropriate check for method == null here

        return (MyDelegate) Delegate.CreateDelegate
            (typeof(MyDelegate), target, method);
    }

    static void Main()
    {
        Dummy dummy = new Dummy();
        MyDelegate del = GetByName(dummy, "ToString");

        Console.WriteLine(del());
    }
}

Mehrdad '

21
ответ дан 5 December 2019 в 06:39
поделиться

Еще проще в использовании:

    public static MyDelegate GetByName(object target, string methodName)
    {
        return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), 
               target, methodName);
    }

Обратите внимание, что CreateDelegate имеет перегрузку, которая принимает methodName для вас. Это было сделано с помощью .net 3.5 Sp1

1
ответ дан 5 December 2019 в 06:39
поделиться
static MyDelegate GetByName(object obj, string methodName)
{
    return () => obj.GetType().InvokeMember(methodName, 
        System.Reflection.BindingFlags.InvokeMethod, null, obj, null); 
}
3
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: