在RoslynPad中使用Extension方法

sur*_*gle 6 c# roslyn roslynpad

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

var p = new Person("Tim");   
p.LastName = "Meier"; 

// reader.Get<bool>("IsDerivat");
var IsOlivia = p.Get<bool>("Olivia");   
Run Code Online (Sandbox Code Playgroud)

这是我在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;
    }        
}    
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误

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

我发现这个问题扩展 - 方法 - 必须定义在顶层 - 静态类 -答案是好的.

添加namespace Foo退货

错误CS7021:无法在脚本代码中声明命名空间

似乎roslynpad添加了幕后的东西.那么我怎样才能确保我的扩展方法是在顶级静态类中定义的?

Eli*_*bel 15

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 
Run Code Online (Sandbox Code Playgroud)

PS - 我是RoslynPad的作者.