6

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

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 是一个嵌套类

我发现这个问题extension-methods-must-be-defined-in-a-top-level-static-class-并且答案很好。

添加namespace Foo退货

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

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

4

2 回答 2

17

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

于 2016-11-08T20:39:58.927 回答
-1

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

所以:

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;
        }        
    }  
}
于 2016-11-04T19:29:34.377 回答