2015-03-16 2 views
1

Я пытаюсь настроить хороший REPL для прохождения кода csharp. Однако я не могу представить код реализации EnvDTE.ProjectItem (interface).Как обеспечить реализацию ProjectItem.get_FileNames (i)?

определение обнаружено нарушение собственности на интерфейсе в индексере:

string FileNames[short i] {get;}

на основе this post я попытался

[IndexerName("FileNames")] 
string ProjectItem.this[short i] {get{return "test";}} 

, который говорит «это» в явном интерфейсе декларация является не является членом интерфейса

[IndexerName("FileNames")] 
public string this[short i] {get{return "test";}} 

Accessor 'UserQuery.ProjectItemFake.this [short] .get' не может реализовать элемент интерфейса 'EnvDTE.ProjectItem.get_FileNames (short)' для типа 'UserQuery.ProjectItemFake'. Используйте явную реализацию интерфейса.

[IndexerName("FileNames")] 
string ProjectItem.this[short i] {get{return "test";}} 

возвращается «это» в явное объявление интерфейса не является членом интерфейса

Я полностью открыт для .net языков с основным пониманием того C#, F #, или VB.net.

Можете ли вы как-то написать реализацию интерфейса EnvDTE.ProjectItem в .net?

ответ

3

Просто реализуйте метод get_FileNames(short i).

Свойства (включая индексированные) фактически преобразуются в методы, подобные get_PropertyName и set_PropertyName под капотом. В большинстве случаев компилятор не позволяет реализовать такие свойства, как это, но только потому, что он зависит от метаданных участника. Именованные индексы недоступны в C#, но они доступны в VB.NET, и я думаю, что интерфейс был определен в VB.NET (они also available in F#, но я не уверен, совместимы они).

Компилятор C# позволяет реализовать индексированные свойства VB.NET как get_PropertyName(Whatever x), потому что это единственный способ их реализации. Я попробовал, и это работает для меня.

Полный C# реализация выглядит следующим образом:

class ProjectItemMock : ProjectItem{ 
    public bool SaveAs(string newFilename) { return false;} 
    public EnvDTE.Window Open(string name) { return null;} 
    public void Remove() {} 
    public void ExpandView(){} 
    public void Save(string filename){} 
    public void Delete(){} 
    public bool IsDirty {get;set;} 
    public string get_FileNames(short index) {return "test";} 
    public short FileCount {get;set;} 
    public string Name{get;set;} 
    public string Kind { get; set; } 
    public EnvDTE.ProjectItems Collection {get;set;} 
    public EnvDTE.Properties Properties {get;set;} 
    public EnvDTE.DTE DTE{get;set;} 
    public EnvDTE.ProjectItems ProjectItems { get; set; } 
    public bool get_IsOpen(string s) { return false;} 
    public object Object { get; set; } 
    public object get_Extender(string s) {return null;} 
    public object ExtenderNames { get; set; } 
    public string ExtenderCATID { get; set; } 
    public bool Saved { get; set; } 
    public EnvDTE.ConfigurationManager ConfigurationManager { get; set; } 
    public EnvDTE.FileCodeModel FileCodeModel { get; set; } 
    public EnvDTE.Document Document { get; set; } 
    public EnvDTE.Project SubProject { get; set; } 
    public EnvDTE.Project ContainingProject { get; set; } 
} 
0

Я подозреваю Greg является правильным, как подобный подход работал в F#

Вот вся реализация интерфейса, который, кажется, работает хорошо.

let makeProjectItem name kind fileNames fcm = 
    let name = ref name 
    let isDirty = ref false 
    let saved = ref false 
    let empty = null 
    let fileNames:string[] = fileNames 
    { 
     new EnvDTE.ProjectItem 
     with 
      member this.FileNames with get(index:int16) = fileNames.[ int(index)] 
      member this.Open(viewKind) = null 
      member this.Remove() =() 
      member this.get_IsOpen s = false 
      member this.Kind = kind 
      member this.ProjectItems = null 
      member this.ExpandView() =() 
      member this.DTE = null 
      member this.Properties = null 
      member this.Object = null 
      member this.Collection = null 
      member this.Saved with get() = !saved and set(value) = saved := value 
      member this.ExtenderCATID = null 
      member this.Name 
       with get() = !name 
       and set(value) = name := value 
      member this.get_Extender (s:string) : obj = null 
      member this.FileCount = 1s 
      member this.SaveAs nfn = false 
      member this.ContainingProject = null 
      member this.SubProject = null 
      member this.Document = null 
      member this.Save fn =() 
      member this.IsDirty with get() = !isDirty and set(value) = isDirty := value 
      member this.Delete() =() 
      member this.get_FileCodeModel():EnvDTE.FileCodeModel = fcm 
      member this.get_ExtenderNames() = null 
      member this.get_ConfigurationManager() = null 
    }