首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提供ProjectItem.get_FileNames(i)的实现?

如何提供ProjectItem.get_FileNames(i)的实现?
EN

Stack Overflow用户
提问于 2015-03-16 15:10:40
回答 2查看 308关注 0票数 1

我正在尝试设置一个很好的REPL,用于移动csharp代码。但是,我似乎无法编写EnvDTE.ProjectItem (接口)实现的代码。

接口上的错误行为属性的定义在索引器中为:

string FileNames[short i] {get;}

基于这个职位我试过

代码语言:javascript
复制
[IndexerName("FileNames")]
string ProjectItem.this[short i] {get{return "test";}}

在显式接口声明中,'this‘不是接口的成员

代码语言:javascript
复制
[IndexerName("FileNames")]
public string this[short i] {get{return "test";}}

返回访问器'UserQuery.ProjectItemFake.thisshort.get‘不能实现'UserQuery.ProjectItemFake’类型的接口成员‘EnvDTE.ProjectItem.get_FileNames(简称)’。使用显式接口实现.

代码语言:javascript
复制
[IndexerName("FileNames")]
string ProjectItem.this[short i] {get{return "test";}}

在显式接口声明中返回'this‘不是接口的成员

我对.net语言完全开放,基本理解是C#、F#或VB.net。

您能以某种方式用EnvDTE.ProjectItem编写.net接口的实现吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 16:08:01

只需实现方法get_FileNames(short i)

属性(包括索引属性)实际上被转换为像get_PropertyNameset_PropertyName这样的方法。在大多数情况下,编译器不允许您实现这样的属性,只是因为它依赖于成员元数据。命名索引器在C#中不可用,但在VB.NET中可用,我认为接口是用VB.NET定义的(它们是也可在F#中获得,但我不确定它们是否兼容)。

C#编译器允许您将VB.NET索引属性实现为get_PropertyName(Whatever x),因为这是实现这些属性的唯一方法。我试过了,而且对我有用。

完整的C#实现如下:

代码语言:javascript
复制
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; }
}
票数 3
EN

Stack Overflow用户

发布于 2015-03-16 18:28:37

我怀疑格雷格是正确的,因为在F#中使用了类似的方法

下面是一个完整的接口实现,它似乎工作得很好。

代码语言:javascript
复制
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
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29080282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档