81 lines
2.8 KiB
C#
81 lines
2.8 KiB
C#
/*
|
|
Copyright 2019 Katy Coe - http://www.djkaty.com - https://github.com/djkaty
|
|
|
|
All rights reserved.
|
|
*/
|
|
|
|
using System;
|
|
using System.Reflection;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using Il2CppTests.TestSources;
|
|
|
|
// This code is adapted from https://docs.microsoft.com/en-us/dotnet/api/system.reflection.customattributedata?view=netframework-4.8
|
|
|
|
// The example attribute is applied to the assembly.
|
|
[assembly: Example(ExampleKind.ThirdKind, Note = "This is a note on the assembly.")]
|
|
|
|
namespace Il2CppTests.TestSources
|
|
{
|
|
// An enumeration used by the ExampleAttribute class.
|
|
public enum ExampleKind
|
|
{
|
|
FirstKind,
|
|
SecondKind,
|
|
ThirdKind,
|
|
FourthKind
|
|
};
|
|
|
|
// An example attribute. The attribute can be applied to all
|
|
// targets, from assemblies to parameters.
|
|
[AttributeUsage(AttributeTargets.All)]
|
|
public class ExampleAttribute : Attribute
|
|
{
|
|
// Data for properties.
|
|
private ExampleKind kindValue;
|
|
private string noteValue;
|
|
private string[] arrayStrings;
|
|
private int[] arrayNumbers;
|
|
|
|
// Constructors. The parameterless constructor (.ctor) calls
|
|
// the constructor that specifies ExampleKind and an array of
|
|
// strings, and supplies the default values.
|
|
public ExampleAttribute(ExampleKind initKind, string[] initStrings) {
|
|
kindValue = initKind;
|
|
arrayStrings = initStrings;
|
|
}
|
|
public ExampleAttribute(ExampleKind initKind) : this(initKind, null) { }
|
|
public ExampleAttribute() : this(ExampleKind.FirstKind, null) { }
|
|
|
|
// Properties. The Note and Numbers properties must be read/write, so they
|
|
// can be used as named parameters.
|
|
public ExampleKind Kind => kindValue;
|
|
public string[] Strings => arrayStrings;
|
|
|
|
public string Note {
|
|
get { return noteValue; }
|
|
set { noteValue = value; }
|
|
}
|
|
public int[] Numbers {
|
|
get { return arrayNumbers; }
|
|
set { arrayNumbers = value; }
|
|
}
|
|
}
|
|
|
|
// The example attribute is applied to the test class.
|
|
[Example(ExampleKind.SecondKind,
|
|
new[] { "String array argument, line 1",
|
|
"String array argument, line 2",
|
|
"String array argument, line 3" },
|
|
Note = "This is a note on the class.",
|
|
Numbers = new[] { 53, 57, 59 })]
|
|
public class Test
|
|
{
|
|
// The example attribute is applied to a method, using the
|
|
// parameterless constructor and supplying a named argument.
|
|
// The attribute is also applied to the method parameter.
|
|
[Example(Note = "This is a note on a method.")]
|
|
public void TestMethod([Example] object arg) { }
|
|
}
|
|
}
|