|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using log4net;
namespace Switch
{
///////////////////////////////////////////////////////////////////////////
//
// SwitchKnownAttribute class
//
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
public sealed class SwitchKnownAttribute : Attribute
{
#region Log
private static readonly ILog log = LogManager.GetLogger(typeof(SwitchKnownAttribute));
#endregion
///////////////////////////////////////////////////////////////////////
//
// Serialize property
//
public bool Serialize
{
get;
set;
}
///////////////////////////////////////////////////////////////////////
//
// Constructor
//
public SwitchKnownAttribute()
{
Serialize = true;
}
private static readonly List<Type> s_types = new List<Type>();
private static readonly List<Assembly> s_assemblies = new List<Assembly>();
///////////////////////////////////////////////////////////////////////
//
// GetKnown()
//
public static IEnumerable<Type> GetKnown(ICustomAttributeProvider provider)
{
lock (s_assemblies)
{
if (s_assemblies.Count == 0)
{
Search(typeof(SwitchKnownAttribute).Assembly);
AppDomain.CurrentDomain.AssemblyLoad += (sender, e) => Search(e.LoadedAssembly);
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
Search(assembly);
}
return s_types.AsReadOnly();
}
}
private static void Search(Assembly assembly)
{
lock (s_assemblies)
{
if (!s_assemblies.Contains(assembly))
{
log.Debug("Searching assembly: " + assembly.GetName().Name);
s_assemblies.Add(assembly);
var types = from type in assembly.GetExportedTypes()
where !type.IsGenericType
select type;
foreach (Type type in types)
{
foreach (SwitchKnownAttribute attr in type.GetCustomAttributes(typeof(SwitchKnownAttribute), false))
{
if (attr.Serialize)
{
log.Info("Found type: " + type);
s_types.Add(type);
break;
}
}
}
}
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Hello, I'm Fred. I've been working with software since I was a kid, and the foreseeable future looks to hold more of the same.
When I was in 4th grade, I had a homework assignment where I was supposed to write out a list of prime numbers less than 100. Instead of writing it out by hand, I spent a couple of minutes writing a simple C program, and turned in a list of prime numbers less than 1,000,000.
Since then, I have enjoyed wasting countless hours (years) playing with various technologies, patterns, and code constructs, and occasionally learn something useful.