簡體   English   中英

我如何提供ProjectItem.get_FileNames(i)的實現?

[英]How do I provide an implementation of ProjectItem.get_FileNames(i)?

我正在嘗試為行走的csharp代碼設置一個很好的REPL 但是,我似乎無法編寫EnvDTE.ProjectItem(接口)的實現。

接口上行為不端屬性的定義在索引器中為:

string FileNames[short i] {get;}

根據這篇文章,我試過了

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

在顯式接口聲明中'this'不是接口的成員

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

返回Accessor'UserQuery.ProjectItemFake.this [short] .get'無法為類型'UserQuery.ProjectItemFake'實現接口成員'EnvDTE.ProjectItem.get_FileNames(short)'。 使用顯式接口實現。

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

在顯式接口聲明中返回'this'不是接口的成員

我對.net語言完全開放,主要理解是C#,F#或VB.net。

你能以某種方式在.net中編寫EnvDTE.ProjectItem接口的實現嗎?

只需實現方法get_FileNames(short i)

屬性(包括索引的)實際上被轉換為get_PropertyNameset_PropertyName等方法。 在大多數情況下,編譯器不允許您實現這樣的屬性,只是因為它依賴於成員元數據。 命名索引器在C#中不可用,但它們在VB.NET中可用,我認為該接口是在VB.NET中定義的(它們也可以在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; }
}

我懷疑格雷格是正確的,因為類似的方法在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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM