高阶功能问题......

sipi41

成员
加入
4月12日,2020年4月12日
消息
6
编程经验
1-3
您好,我是新手C#,我正在阅读我的书,我可以将功能传递为参数和接收功能或两个...所以我正在尝试锻炼,但不能制作这项工作......请帮忙!

我的想法是创造这样的静态函数:
C#:
public static void TestMethod<T1, TResult>(Func<T1, TResult> myfunction ) {
            ...
}
现在,想法是我可以通过提供与T1匹配的函数和如此匹配的函数来调用这种静态方法:
C#:
Func<string, string> ChangeName = name => $"My name is: {name}";

TestMethod<string, string>(ChangeName);
现在我的理解是,在试验方法内我收到了一个函数,现在我可以利用myfunction并致电它行动,我对吗?在这种情况下,如果我调用函数,它应该返回一个字符串(根据我的定义),所以我想我应该能够这样做:
C#:
public static void TestMethod<T1, TResult>(Func<T1, TResult> myfunction ) {
    Console.WriteLine(    myfunction.Invoke()        );
        // or
    Console.WriteLine(    myfunction()    );
}
但我不能因为它显示一个询问T1参数的错误......
untitled.png.


请帮忙!...
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
您指定函数具有参数。该参数的参数在哪里?你在这里特别说明:
C#:
Func<string, string> ChangeName = name => $"My name is: {name}";
您的函数应该接受名称值并返回包含该名称的某些文本。当你称之为时,姓名在哪里?你没有提供它。它必须来自某个地方,你必须把它传递给这个功能。
 

sipi41

成员
加入
4月12日,2020年4月12日
消息
6
编程经验
1-3
您指定函数具有参数。该参数的参数在哪里?你在这里特别说明:
C#:
Func<string, string> ChangeName = name => $"My name is: {name}";
您的函数应该接受名称值并返回包含该名称的某些文本。当你称之为时,姓名在哪里?你没有提供它。它必须来自某个地方,你必须把它传递给这个功能。
那么正确的实现是什么?例如,如果在我的函数上我打电话给数据库或文本文件来获取名称,现在我有一个变量的方法,现在我已经准备好调用了这个功能,我该怎么做然后??感谢您的帮助! :)
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
这是一个免费赠品:
C#:
Console.WriteLine(myfunction("Asmodeus"));
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
啊!好点...目前现在忙碌,但这是一个快速而肮脏的解决方法:
C#:
class Program
{
    public static void TestMethod<T1, TResult>(Func<T1, TResult> myfunction, T1 param1)
    {
        Console.WriteLine(myfunction(param1));
    }

    static void Main()
    {
        Func<string, string> changeName = name => $"My name is: {name}";

        TestMethod<string, string>(changeName, "Asmodeus");
    }
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
如果您要编写一般方法,那么您必须编写泛型的代码,即,适用于所有通用参数类型。基本上,你想要做什么并不是有意义的。你正在尝试为展示特定功能而有影响,并没有意义。这就是为什么这么多初学者分配是垃圾的原因:因为他们尝试使用功能是愚蠢的方式,没有明智的开发人员将使用它。

在你的情况下,你的 测试方法 说它将接受具有单个参数的任何方法和返回类型并执行它。您希望如何使用类型的参数执行方法 T1 如果您没有将该类型的值作为参数传递? 测试方法 必须获得类型的值 T1 从某个地方。 @skydiver 已经显示了一种方法来实现这一点,即添加该类型的参数 测试方法。这相当胜过 测试方法 毫无意义的,除了学习援助。问题是,在试图学习某些东西时,你已经让它变得更加困惑。这就是生命。有时候,这是唯一的方法。
 

sipi41

成员
加入
4月12日,2020年4月12日
消息
6
编程经验
1-3
如果您要编写一般方法,那么您必须编写泛型的代码,即,适用于所有通用参数类型。基本上,你想要做什么并不是有意义的。你正在尝试为展示特定功能而有影响,并没有意义。这就是为什么这么多初学者分配是垃圾的原因:因为他们尝试使用功能是愚蠢的方式,没有明智的开发人员将使用它。

在你的情况下,你的 测试方法 说它将接受具有单个参数的任何方法和返回类型并执行它。您希望如何使用类型的参数执行方法 T1 如果您没有将该类型的值作为参数传递? 测试方法 必须获得类型的值 T1 从某个地方。 @skydiver 已经显示了一种方法来实现这一点,即添加该类型的参数 测试方法。这相当胜过 测试方法 毫无意义的,除了学习援助。问题是,在试图学习某些东西时,你已经让它变得更加困惑。这就是生命。有时候,这是唯一的方法。
好的......这个评论没有很多帮助......我们已经知道我们需要从某个地方的T1类型值......如果这是错误的,你的解决方案是什么?如果这是毫无意义的话,那可能更好?谢谢你帮助澄清这个......
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
正如我所说,这个问题是你正在努力隐藏一些东西。如果您有一个想法,您实际上可能实际上这样做的事情,那么获得所需的数据不会是一个问题。更逼真的情况是您有一个没有参数的方法,它通过无论机制适当地获取它所需要的数据。例如。
C#:
using System;
using System.IO;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Use a method group as a delegate.
            DisplayOutput(Console.ReadLine);

            // Use a Lambda as a delegate.
            DisplayOutput(() =>
            {
                Console.Write("Enter text file path: ");

                var filePath = Console.ReadLine();

                return File.Exists(filePath)
                    ? "No file specified"
                    : File.ReadAllText(filePath);
            });

            Console.ReadLine();
        }

        private static void DisplayOutput<TResult>(Func<TResult> method)
        {
            Console.WriteLine(method());
        }
    }
}
然后你可以使用 DisplayOutput. 要执行任何任何不可分割的函数并将结果输出到控制台。
 

sipi41

成员
加入
4月12日,2020年4月12日
消息
6
编程经验
1-3
正如我所说,这个问题是你正在努力隐藏一些东西。如果您有一个想法,您实际上可能实际上这样做的事情,那么获得所需的数据不会是一个问题。更逼真的情况是您有一个没有参数的方法,它通过无论机制适当地获取它所需要的数据。例如。
C#:
using System;
using System.IO;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Use a method group as a delegate.
            DisplayOutput(Console.ReadLine);

            // Use a Lambda as a delegate.
            DisplayOutput(() =>
            {
                Console.Write("Enter text file path: ");

                var filePath = Console.ReadLine();

                return File.Exists(filePath)
                    ? "No file specified"
                    : File.ReadAllText(filePath);
            });

            Console.ReadLine();
        }

        private static void DisplayOutput<TResult>(Func<TResult> method)
        {
            Console.WriteLine(method());
        }
    }
}
然后你可以使用 DisplayOutput. 要执行任何任何不可分割的函数并将结果输出到控制台。
是有道理的......我们在DisplayOutput内完成登录...那么如果无论如何都是真的或X我们调用方法,没有参数......
 
最佳 底部