private void BuildRegularInterfaceHandlers()
{
foreach (var ifs in _type.GetInterfaces())
{
if (ifs.GetInterfaces().All(t => t != typeof(IInterfacedActor) && t != typeof(IInterfacedActorSync)))
continue;
var primaryInterface = ifs;
var alternativeInterfaceAttribute = ifs.GetCustomAttribute<AlternativeInterfaceAttribute>();
if (alternativeInterfaceAttribute != null)
{
primaryInterface = alternativeInterfaceAttribute.Type.IsGenericType
? alternativeInterfaceAttribute.Type.MakeGenericType(ifs.GetGenericArguments())
: alternativeInterfaceAttribute.Type;
}
var interfaceMap = _type.GetInterfaceMap(ifs);
var methodItems = interfaceMap.InterfaceMethods.Zip(interfaceMap.TargetMethods, Tuple.Create)
.OrderBy(p => p.Item1, new MethodInfoComparer())
.ToArray();
var payloadTypeTable = GetInterfacePayloadTypeTable(primaryInterface);
for (var i = 0; i < methodItems.Length; i++)
{
var targetMethod = methodItems[i].Item2;
var invokePayloadType = payloadTypeTable[i, 0];
var returnPayloadType = payloadTypeTable[i, 1];
var filterChain = _filterHandlerBuilder.Build(targetMethod, FilterChainKind.Request);
var isSyncHandler = alternativeInterfaceAttribute != null && filterChain.AsyncFilterExists == false;
var isReentrant = isSyncHandler == false && HandlerBuilderHelpers.IsReentrantMethod(targetMethod);
AddHandler(ifs, targetMethod, invokePayloadType, returnPayloadType, filterChain, isSyncHandler, isReentrant);
}
}
}