public void Indexers()
{
var nspace = new CodeNamespace("NSPC");
var cd = new CodeTypeDeclaration("TEST");
cd.IsClass = true;
nspace.Types.Add(cd);
CodeMemberField field = new CodeMemberField();
field.Name = "PublicField";
field.InitExpression = new CodeArrayCreateExpression(new CodeTypeReference(typeof(int)), new CodeExpression[]{
new CodePrimitiveExpression(0), new CodePrimitiveExpression(0),new CodePrimitiveExpression(0),new CodePrimitiveExpression(0),
new CodePrimitiveExpression(0),new CodePrimitiveExpression(0), new CodePrimitiveExpression(0)});
field.Attributes = MemberAttributes.Public | MemberAttributes.Final;
field.Type = new CodeTypeReference(typeof(int[]));
cd.Members.Add(field);
// nonarray indexers
CodeMemberProperty indexerProperty = new CodeMemberProperty();
indexerProperty.Name = "Item";
indexerProperty.Attributes = MemberAttributes.Public | MemberAttributes.Final;
indexerProperty.Type = new CodeTypeReference(typeof(int));
indexerProperty.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "i"));
// uses array indexer
indexerProperty.SetStatements.Add(new CodeAssignStatement(new CodeArrayIndexerExpression(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression()
, "PublicField"), new CodeExpression[] { new CodeVariableReferenceExpression("i") }),
new CodeVariableReferenceExpression("value")));
indexerProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodeArrayIndexerExpression(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "PublicField"),
new CodeVariableReferenceExpression("i"))));
cd.Members.Add(indexerProperty);
// nonarray indexers
indexerProperty = new CodeMemberProperty();
indexerProperty.Name = "Item";
indexerProperty.Attributes = MemberAttributes.Public | MemberAttributes.Final;
indexerProperty.Type = new CodeTypeReference(typeof(int));
indexerProperty.SetStatements.Add(new CodeAssignStatement(new CodeArrayIndexerExpression(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression()
, "PublicField"), new CodeExpression[] { new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add,
new CodeVariableReferenceExpression("b"))}),
new CodeVariableReferenceExpression("value")));
indexerProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodeArrayIndexerExpression(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "PublicField"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add, new CodeVariableReferenceExpression("b")))));
indexerProperty.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "a"));
indexerProperty.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "b"));
// uses array indexer
cd.Members.Add(indexerProperty);
cd = new CodeTypeDeclaration("UseTEST");
cd.IsClass = true;
nspace.Types.Add(cd);
var cmm = new CodeMemberMethod();
cmm.Name = "TestMethod";
cmm.ReturnType = new CodeTypeReference(typeof(int));
cmm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "i"));
cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("TEST"),
"temp", new CodeObjectCreateExpression("TEST")));
cmm.Statements.Add(new CodeAssignStatement(new CodeIndexerExpression(
new CodeVariableReferenceExpression("temp"), new CodeExpression[] { new CodePrimitiveExpression(1) }),
new CodeVariableReferenceExpression("i")));
cmm.Statements.Add(new CodeAssignStatement(new CodeIndexerExpression(
new CodeVariableReferenceExpression("temp"), new CodeExpression[]{new CodePrimitiveExpression(2),
new CodePrimitiveExpression(4)}),
new CodePrimitiveExpression(83)));
cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
new CodeIndexerExpression(new CodeVariableReferenceExpression("temp"), new CodeExpression[] { new CodePrimitiveExpression(1) }),
CodeBinaryOperatorType.Add,
new CodeIndexerExpression(new CodeVariableReferenceExpression("temp"), new CodeExpression[] { new CodePrimitiveExpression(2), new CodePrimitiveExpression(4) }))));
cd.Members.Add(cmm);
AssertEqual(nspace,
@"namespace NSPC {
public class TEST {
public int[] PublicField = new int[] { 0, 0, 0, 0, 0, 0, 0};
public int this[int i] {
get {
return this.PublicField[i];
}
set {
this.PublicField[i] = value;
}
}
public int this[int a, int b] {
get {
return this.PublicField[(a + b)];
}
set {
this.PublicField[(a + b)] = value;
}
}
}
public class UseTEST {
public int TestMethod(int i) {
TEST temp = new TEST();
temp[1] = i;
temp[2, 4] = 83;
return (temp[1] + temp[2, 4]);
}
}
}");
}