Func <T>作为类成员,访问实例的其他成员

Dän*_*änu 4 c# lambda func

我有一个问题,是否可以(如果是,如何)classFunc<T, TResult>代表内部访问成员.

例如,我有以下内容class:

class NinjaTurtle
{
    public string Sound { get; set; }
    public Func<string, string> DoNinjaMove { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我想这样做

NinjaTurtle leonardo = new NinjaTurtle();
leonardo.Sound = "swiishhh!";
leonardo.DoNinjaMove = (move) => {
    if(move == "katana slash") return leonardo.Sound;
    return "zirp zirp zirp";
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我定义回调函数时,如何正确访问属性Sound?从函数外部使用对实例的引用是否可以?当我将对象传递给另一个方法时,或者当这将成为dll的一部分时,这仍然有用吗?我会从dll中的函数返回对象leonardo吗?它会"生存"序列化/反序列化吗?

(感谢弗拉基米尔和李,这个问题现在更具体到我想知道的内容).

Mat*_*zer 5

你可以使用闭包.闭包将是一个匿名委托或lambda表达式,它可以引用外部作用域中的变量,方法,属性,事件或任何东西(哎呀,这是你的情况!).

leonardo.DoNinjaMove = (move) => {
    // THIS IS VALID! IT'S A CLOSURE! You can access leonardo reference within
    // the closure!!
    if(move == "katana slash") return leonardo.Sound; 
    return "zirp zirp zirp";
}
Run Code Online (Sandbox Code Playgroud)

无论如何,DoNinjaMoveFunc<string, bool>.如果要返回Sound值,则应重构为Func<string, string>.

有关闭包如何工作的详细信息以及为什么可以安全地使用外部作用域的引用,可以在StackOverflow中的其他问答中找到:

关于在使用卫星装配时使用闭合装置是否可行...

是的,这没问题.闭包是大多数现代语言拥有的非常有趣的功能,它是包含函数式编程的语言的必备功能.无论如何,这是必备功能!:)