在 RoslynPad 中使用扩展方法

Using Extension methods in RoslynPad

我试着理解一个类似这段代码的扩展方法

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;
    }        
}    

但是我得到这个错误

error CS1109: Extension methods must be defined in a top level static class; PersonExtensions is a nested class

我找到了这个问题extension-methods-must-be-defined-in-a-top-level-static-class-,答案很好。

添加 namespace Foo returns

error CS7021: Cannot declare namespace in script code

roslynpad 似乎在幕后添加了一些东西。 那么我如何确保我的扩展方法是在顶级静态 class?

中定义的?

要被视为顶级 class,必须在 namespace 内部定义 class。将您的 Person 和 PersonExtensions classes 的声明移动到命名空间,这将解决问题。

所以:

namespace MyPersonNamespace
{
    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;
        }        
    }  
}

RoslynPad使用Roslyn的script language syntax,它不允许classes中的扩展方法(因为整个脚本实际上是一个class,而C#不允许嵌套中的扩展classes).

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

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 的作者。