Nano Hash - криптовалюты, майнинг, программирование

Список функций для хранения указателя функции и значения параметра

Я хочу сохранить список функций со значением их параметра, а затем, когда я закончу добавлять функцию в список. Я хочу выполнить все в том порядке, в котором я добавил.

Например, я хочу использовать func вместо action и не хочу создавать анонимные функции при вызове параметризованной функции:

Класс динамического списка функций для хранения списка функций и последующего его выполнения.

class DynamicFunctionList
{
    public List<Action> DynamicList = new List<Action>();
    public void Execute()
    {
        foreach (var obj in DynamicList)
        {
           obj();
        }
    }

}

некоторый класс с функциями

public class SomeClass
{
    public void PrintHello()
    {
       Console.Write("Hello");

    }

    public void PrintBye()
    {
        Console.Write("Print Bye");
    }

    public int GetPrinterValue()
    {
        return 2;
    }

    public int Add(int a, int b)
    {
        return (a + b);
    }
}

И вот как вы будете использовать его

public static void MainClass()
    {
        var first = 0;
        var second = 0;
        var dfList = new DynamicFunctionList();
        var sClass = new SomeClass();
        dfList.DynamicList.Add(() => first = sClass.GetPrinterValue()); // problem line
        dfList.DynamicList.Add(sClass.PrintBye);
        dfList.DynamicList.Add(sClass.PrintHello);
        dfList.DynamicList.Add(() => second = sClass.Add(2, 3)); // problem
        dfList.Execute();
    }
26.03.2015

  • Было бы неплохо, если бы вместо проблемы вы добавили точное сообщение об ошибке, которое вы получаете. Или в чем конкретно проблема. 26.03.2015
  • Насколько я могу судить, этот код работает. Работает ли он так, как задумано, мне неизвестно, потому что вы не поняли, в чем проблема и чего вы ожидаете от этого кода. 26.03.2015
  • Извините за путаницу. код сообщения об ошибке не будет выполняться идеально. мой вопрос: могу ли я использовать func вместо действия, и если да, то как. потому что действие не возвращает значения. поэтому, чтобы сохранить функцию с параметром и возвращаемым значением, мне нужно создать еще одну анонимную функцию, чтобы обернуть ее, а затем добавить в список. как вы думаете, это имеет какой-то смысл, или я должен использовать именно так 27.03.2015

Ответы:


1

Я делаю что-то вроде этого:

    public void main()
    {
        List<MethodInvoker> methods = new List<MethodInvoker>();
        methods.Add(new MethodInvoker(SomeMethod));

        foreach (var method in methods)
        {
            method.Invoke();
        }
    }

    public void SomeMethod()
    {
        //... do something
    }

РЕДАКТИРОВАТЬ 1:

Вы можете использовать MethodBase.Invoke из пространства имен System.Reflection (дополнительная информация: https://msdn.microsoft.com/en-us/library/a89hcwhh%28v=vs.110%29.aspx)

Вы можете сделать что-то вроде этого:

public class DynamicMethod
{        
     public string ClassName { get; set; }

     public string MethodName { get; set; }

     public object[] Parameters { get; set; }

     public static object InvokeMethod(DynamicMethod methodInfo)
     {
         var magicType = Type.GetType(methodInfo.ClassName);
         var magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
         var magicInstance = magicConstructor.Invoke(new object[] {});

         var magicMethod = magicType.GetMethod(methodInfo.MethodName);
         return magicMethod.Invoke(magicInstance, methodInfo.Parameters);
     }
}

public class Example
{
    public static void main()
    {
        var d1 = new DynamicMethod
        {
            ClassName = "SomeClass",
            MethodName = "Add",
            Parameters = new object[] { 1, 2 }
        };

        var returnedValue = DynamicMethod.InvokeMethod(d1);   
        Console.WriteLine(returnedValue.ToString());
    }

Также вы можете добавить больше информации в этот класс, например, какой-то способ сохранить возвращаемый тип для правильного приведения.

26.03.2015
  • MethodInvoker аналогичен действию, которое является открытым делегатом void x(). Я хочу вернуть значение из функции и использовать его. 26.03.2015
  • Я отредактировал код и добавил пример использования MethodBase.Invoke из пространства имен System.Reflection, посмотрите и скажите, решит ли это вашу проблему. 27.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..