- matrix_superpool_standalone.zip
- LGPL License.txt
- Lib
- PowerCollections.dll
- Matrix.Framework.SuperPool.Standalone
- bin
- Debug
- Release
- Common.Sockets
- Common
- Core
- License.txt
- Matrix.Common.Core
- Matrix.Common.Extended
- Matrix.Common.Sockets
- Common
- Core
- Matrix.Framework.MessageBus
- Client
- Matrix.Framework.SuperPool.Standalone.csproj
- Matrix.Framework.SuperPool.Standalone.csproj.user
- Matrix.Framework.SuperPool
- Call
- Clients
- Core
- DynamicProxy
- Subscription
- Notes.txt
- Properties
- Matrix.SuperPool.Full.sln
- Matrix.SuperPool.sln
- Tests
- Lib
- log4net.dll
- Matrix.Common.Core.dll
- Matrix.Common.Diagnostics.dll
- Matrix.Common.Diagnostics.FrontEnd.dll
- Matrix.Common.Extended.dll
- Matrix.Common.FrontEnd.dll
- Matrix.Common.Sockets.dll
- Matrix.Framework.TestFramework.dll
- nunit.framework.dll
- Matrix.Framework.SuperPool.Demonstration
- Matrix.Framework.SuperPool.Test
- Matrix.Framework.SuperPool.UnitTest
|
// -----
// Copyright 2010 Deyan Timnev
// This file is part of the Matrix Platform (www.matrixplatform.com).
// The Matrix Platform is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version. The Matrix Platform is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public License along with the Matrix Platform. If not, see http://www.gnu.org/licenses/lgpl.html
// -----
using System;
using System.Reflection.Emit;
using System.Reflection;
#if Matrix_Diagnostics
using Matrix.Common.Diagnostics;
#endif
namespace Matrix.Framework.SuperPool.DynamicProxy
{
/// <summary>
/// Stores info on a single standalone method, or a method generated as a part of proxy class.
/// The method is what we need, and the class stores it
/// and provides it with member instances.
/// </summary>
public class GeneratedMethodInfo
{
#region Common
public int Id { get; protected set; }
/// <summary>
/// Assigned trough usage by a Super pool component.
/// </summary>
public string EventName { get; set; }
#endregion
#region Standalone specific
public bool IsStandalone
{
get
{
return StandaloneDynamicMethod != null;
}
}
/// <summary>
/// The dynamic method we generated
/// </summary>
public DynamicMethod StandaloneDynamicMethod { get; protected set; }
#endregion
#region Part of proxy specific
public bool IsProxyClassMethod
{
get
{
return ProxyOwnerType != null;
}
}
/// <summary>
/// The owner proxy type (if available).
/// </summary>
public Type ProxyOwnerType { get; protected set; }
/// <summary>
/// The method info we implement upon.
/// </summary>
public MethodInfo ProxyMethodInfo { get; protected set; }
#endregion
/// <summary>
/// Construct proxy class method.
/// </summary>
public GeneratedMethodInfo(int id, Type proxyType, MethodInfo methodInfo)
{
Id = id;
ProxyMethodInfo = methodInfo;
ProxyOwnerType = proxyType;
}
/// <summary>
/// Construct standalone.
/// </summary>
public GeneratedMethodInfo(int id, DynamicMethod dynamicMethod, Type delegateType)
{
this.Id = id;
//this.StandaloneDelegateType = delegateType;
this.StandaloneDynamicMethod = dynamicMethod;
}
/// <summary>
/// This operates on valid object in both a Standalone and Proxy method modes.
/// </summary>
public MethodInfo GetMethodInfo()
{
if (IsProxyClassMethod)
{
return ProxyMethodInfo;
}
else if (IsStandalone)
{
return StandaloneDynamicMethod;
}
return null;
}
/// <summary>
/// Only works for ProxyTypes, since stand alone methods do not have it.
/// </summary>
/// <returns></returns>
public Type GetBaseInterfaceType()
{
Type proxyType = ProxyOwnerType;
Type[] interfaceTypes = proxyType.GetInterfaces();
if (interfaceTypes.Length != 1)
{
#if Matrix_Diagnostics
SystemMonitor.Error(string.Format("Proxy class [{0}] does not provide clear interface specification.", proxyType.ToString()));
#endif
return null;
}
return interfaceTypes[0];
}
public override string ToString()
{
MethodInfo methodInfo = GetMethodInfo();
if (methodInfo == null)
{// Instance not initialized properly yet.
return base.ToString();
}
if (IsStandalone)
{
return "Standalone method [" + methodInfo.ToString() + "]";
}
else
{
Type baseInterfaceType = GetBaseInterfaceType();
return "Generated method info for [" + baseInterfaceType.Name + "." + methodInfo.ToString() + "]";
}
}
}
}
|
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.
I worked for a few years as a C++/Win32 developer and software architect, and then moved on to the .NET environment where I was able to discover the beauty of managed programming.
I am currently involved in the development and management of Open Forex Platform (www.openforexplatform.com) and the Matrix Platform (www.matrixplatform.com).