2016-11-04 3 views
4

Я пытаюсь понять метод расширения, подобный этому кодуИспользование методов расширения в 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; 
    }   
}  

Но я получаю эту ошибку

ошибка CS1109: методы расширения должны быть определены в старшем статическом уровне класс; PersonExtensions - это вложенный класс

Я нашел этот вопрос extension-methods-must-be-defined-in-a-top-level-static-class- и ответы хорошие.

Добавление namespace Foo возвращает

ошибка CS7021: Не может объявить пространство имен в коде сценария

Кажется, что roslynpad добавляет вещи за сценой. Итак, как я могу убедиться, что мой метод расширения определен в статическом классе верхнего уровня?

+1

звучит как-то, что вы должны открыть для проблемы github. –

+0

Это возвращает ошибку 'CS7021: невозможно объявить пространство имен в коде скрипта', и есть несколько проблем, связанных с этой ошибкой [4478] (https://github.com/dotnet/roslyn/issues/4478) или [1078] (https: //github.com/scriptcs/scriptcs/issues/1078) – surfmuggle

+0

var IsOlivia = p.Get («Olivia»); неверно кстати –

ответ

8

RoslynPad использует Рослин-х script language syntax, который не допускает методы расширения в классах (потому что весь сценарий на самом деле класс, и 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.

0

Чтобы считаться классом верхнего уровня, класс должен быть определен внутри 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; 
     }   
    } 
} 
+0

Это возвращает ошибку 'CS7021: невозможно объявить пространство имен в коде скрипта', и есть несколько проблем, связанных с этой ошибкой: [4478] (https://github.com/dotnet/roslyn/issues/4478) или [1078] (https: //github.com/scriptcs/scriptcs/issues/1078) – surfmuggle

+0

Похоже, что это известная проблема с roslyn. К сожалению, пока это не будет разрешено, вы не сможете использовать методы расширения внутри roslynpad. –

Смежные вопросы