在RoslynPad或Polyglot笔记本中使用扩展方法

本文关键字:扩展 方法 笔记本 RoslynPad Polyglot | 更新日期: 2023-09-27 18:16:18

我试图理解类似于此代码的扩展方法

var p = new Person("Tim");   
p.LastName = "Meier"; 
// reader.Get<bool>("IsDerivat");
var IsOlivia = p.Get<bool>("Olivia");   

这是我在RoslynPad中的代码:

public static class PersonExtensions
{
    public static T Get<T>(this Person person, string name)
    {
        return (T)person.NewFirstName(name);
    }
}
public class Person
{    
    public Person(string firstName)
    {
        this.FirstName = firstName;
    }
    public string FirstName {get; private set;}
    public string LastName {get; set;}
    public object NewFirstName(string name)
    {
        this.FirstName = name;
        return (object) this.FirstName;
    }        
}    

但是我得到这个错误

错误CS1109:扩展方法必须在顶级静态中定义类;PersonExtensions是一个嵌套类

我发现这个问题必须在顶级静态类中定义扩展方法-并且答案很好。

添加namespace Foo返回

错误:不能在脚本代码中声明命名空间

似乎roslynpad在幕后添加了一些东西。那么,如何确保扩展方法是在顶级静态类中定义的呢?

在RoslynPad或Polyglot笔记本中使用扩展方法

RoslynPad使用Roslyn的脚本语言语法,它不允许在类中扩展方法(因为整个脚本实际上是一个类,c#不允许在嵌套类中扩展)。

当前,您唯一的选择(除了使用#r指令引用包含扩展类的编译程序集之外)是将扩展作为脚本中的顶级方法。例如:

public static T Get<T>(this Person person, string name)
{
    return (T)person.NewFirstName(name);
}
var p = new Person("Tim");   
p.LastName = "Meier"; 
var IsOlivia = p.Get<bool>("Olivia"); // works 

PS -我是RoslynPad的作者。