gpt4 book ai didi

c# - 如何使用 CodeDOM 创建显式接口(interface)声明索引属性

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:04 26 4
gpt4 key购买 nike

我正在尝试创建一个显式接口(interface)声明索引属性。例如:

public interface IFoo
{
int this[int i]
}

public abstract class Foo : IFoo
{
int IFoo.this[int i]
}

为此我编写了以下代码(这适用于普通索引属性,但不适用于显式接口(interface)声明索引属性):

var iface = typeof(IFoo);
var method = iface.GetMethod("Item"); // get the indexer

CodeMemberProperty memberIndexer = new CodeMemberProperty();

memberIndexer.Name = iface.Name + ".Item";

memberIndexer.Type = new CodeTypeReference(method.ReturnType.Name);
memberIndexer.HasSet = true;
memberIndexer.HasGet = true;

foreach (var param in method.GetParameters())
{
memberIndexer.Parameters.Add(
new CodeParameterDeclarationExpression(
new CodeTypeReference(param.ParameterType), param.Name));
}

// Explicit interface declaration cannot have any modifiers
memberIndexer.Attributes = ~MemberAttributes.Private;

// add to both set/get to NotImplementedException
var exceptionStatement = new CodeThrowExceptionStatement(
new CodeObjectCreateExpression(
new CodeTypeReference(typeof(System.NotImplementedException)),
new CodeExpression[] { }));
memberIndexer.GetStatements.Add(exceptionStatement);
memberIndexer.SetStatements.Add(exceptionStatement);

TargetClass.Members.Add(memberIndexer);

但是,这会生成以下代码:

int IFoo.Item
{
get
{
throw new System.NotImplementedException();
}
set
{
throw new System.NotImplementedException();
}
}

关于如何正确执行此操作的任何想法?

最佳答案

您不应该通过更改 Name 来执行此操作。相反,您应该使用专用于此目的的属性:PrivateImplementationType :

memberIndexer.PrivateImplementationType = new CodeTypeReference(iface);

关于c# - 如何使用 CodeDOM 创建显式接口(interface)声明索引属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16656815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com