You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/src/Microsoft.AspNet.SignalR.Core/Hubs/ReflectionHelper.cs

70 lines
2.3 KiB

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Microsoft.AspNet.SignalR.Hubs
{
public static class ReflectionHelper
{
private static readonly Type[] _excludeTypes = new[] { typeof(Hub), typeof(object) };
private static readonly Type[] _excludeInterfaces = new[] { typeof(IHub), typeof(IDisposable) };
public static IEnumerable<MethodInfo> GetExportedHubMethods(Type type)
{
if (!typeof(IHub).IsAssignableFrom(type))
{
return Enumerable.Empty<MethodInfo>();
}
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);
var allInterfaceMethods = _excludeInterfaces.SelectMany(i => GetInterfaceMethods(type, i));
return methods.Except(allInterfaceMethods).Where(IsValidHubMethod);
}
private static bool IsValidHubMethod(MethodInfo methodInfo)
{
return !(_excludeTypes.Contains(methodInfo.GetBaseDefinition().DeclaringType) ||
methodInfo.IsSpecialName);
}
private static IEnumerable<MethodInfo> GetInterfaceMethods(Type type, Type iface)
{
if (!iface.IsAssignableFrom(type))
{
return Enumerable.Empty<MethodInfo>();
}
return type.GetInterfaceMap(iface).TargetMethods;
}
public static TResult GetAttributeValue<TAttribute, TResult>(ICustomAttributeProvider source, Func<TAttribute, TResult> valueGetter)
where TAttribute : Attribute
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (valueGetter == null)
{
throw new ArgumentNullException("valueGetter");
}
var attributes = source.GetCustomAttributes(typeof(TAttribute), false)
.Cast<TAttribute>()
.ToList();
if (attributes.Any())
{
return valueGetter(attributes[0]);
}
return default(TResult);
}
}
}