在 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 的作者。
我试着理解一个类似这段代码的扩展方法
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 的作者。