a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
148 lines
3.1 KiB
C#
148 lines
3.1 KiB
C#
//
|
|
// Access modifiers
|
|
// We use reflection to test that the flags are the correct ones
|
|
//
|
|
|
|
using System;
|
|
using System.Reflection;
|
|
|
|
[AttributeUsage (AttributeTargets.Class)]
|
|
public class TypeCheckAttribute : Attribute {
|
|
|
|
public TypeCheckAttribute ()
|
|
{
|
|
}
|
|
}
|
|
|
|
[AttributeUsage (AttributeTargets.Property)]
|
|
public class PropertyCheckAttribute : Attribute {
|
|
|
|
public PropertyCheckAttribute ()
|
|
{
|
|
}
|
|
}
|
|
|
|
[AttributeUsage (AttributeTargets.Method)]
|
|
public class AccessorCheckAttribute : Attribute {
|
|
MethodAttributes flags;
|
|
|
|
public AccessorCheckAttribute (MethodAttributes flags)
|
|
{
|
|
this.flags = flags;
|
|
}
|
|
|
|
public MethodAttributes Attributes {
|
|
get {
|
|
return flags;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class Test {
|
|
|
|
public static int Main (string [] args)
|
|
{
|
|
Type t = typeof (A);
|
|
|
|
foreach (PropertyInfo pi in t.GetProperties ()) {
|
|
object [] attrs = pi.GetCustomAttributes (typeof (PropertyCheckAttribute), true);
|
|
if (attrs == null)
|
|
return 0;
|
|
|
|
MethodInfo get_accessor, set_accessor;
|
|
get_accessor = pi.GetGetMethod (true);
|
|
set_accessor = pi.GetSetMethod (true);
|
|
|
|
if (get_accessor != null)
|
|
CheckFlags (pi, get_accessor);
|
|
if (set_accessor != null)
|
|
CheckFlags (pi, set_accessor);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void CheckFlags (PropertyInfo pi, MethodInfo accessor)
|
|
{
|
|
object [] attrs = accessor.GetCustomAttributes (typeof (AccessorCheckAttribute), true);
|
|
if (attrs == null)
|
|
return;
|
|
|
|
AccessorCheckAttribute accessor_attr = (AccessorCheckAttribute) attrs [0];
|
|
MethodAttributes accessor_flags = accessor.Attributes;
|
|
|
|
if ((accessor_flags & accessor_attr.Attributes) == accessor_attr.Attributes)
|
|
Console.WriteLine ("Test for {0}.{1} PASSED", pi.Name, accessor.Name);
|
|
else {
|
|
string message = String.Format ("Test for {0}.{1} INCORRECT: MethodAttributes should be {2}, but are {3}",
|
|
pi.Name, accessor.Name, accessor_attr.Attributes, accessor_flags);
|
|
throw new Exception (message);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
[TypeCheck]
|
|
public class A {
|
|
|
|
const MethodAttributes flags = MethodAttributes.HideBySig |
|
|
MethodAttributes.SpecialName;
|
|
|
|
[PropertyCheck]
|
|
public int Value1 {
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
get {
|
|
return 0;
|
|
}
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
set {
|
|
}
|
|
}
|
|
|
|
[PropertyCheck]
|
|
public int Value2 {
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
get {
|
|
return 0;
|
|
}
|
|
[AccessorCheck (flags | MethodAttributes.FamORAssem)]
|
|
protected internal set {
|
|
}
|
|
}
|
|
|
|
[PropertyCheck]
|
|
public int Value3 {
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
get {
|
|
return 0;
|
|
}
|
|
[AccessorCheck (flags | MethodAttributes.Family)]
|
|
protected set {
|
|
}
|
|
}
|
|
|
|
[PropertyCheck]
|
|
public int Value4 {
|
|
[AccessorCheck (flags | MethodAttributes.Assembly)]
|
|
internal get {
|
|
return 0;
|
|
}
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
set {
|
|
}
|
|
}
|
|
|
|
[PropertyCheck]
|
|
public int Value5 {
|
|
[AccessorCheck (flags | MethodAttributes.Public)]
|
|
get {
|
|
return 0;
|
|
}
|
|
[AccessorCheck (flags | MethodAttributes.Private)]
|
|
private set {
|
|
}
|
|
}
|
|
|
|
}
|
|
|