- castleextensionsdemo.zip
- App.Configuration
- App.Core
- App.Data
- Castle.ExtensibleDynamicProxy
- Castle.Facilities.PresentationModelIntegration
- CastleExtensionsDemo.sln
- libs
- AttachedCommandBehavior.dll
- Castle.Core.dll
- Castle.DynamicProxy2.dll
- Castle.MicroKernel.dll
- Castle.Windsor.dll
- PresentationModelBase
- WPFUI
|
using System;
using System.Reflection;
using System.Reflection.Emit;
using Castle.DynamicProxy;
using Castle.DynamicProxy.Contributors;
using Castle.DynamicProxy.Generators;
using Castle.DynamicProxy.Generators.Emitters;
using PresentationModelBase;
namespace Castle.Facilities.PresentationModelIntegration
{
public class CallPropertyTypeContributor : ITypeContributor
{
public void CollectElementsToProxy(IProxyGenerationHook hook, MetaType model)
{
}
public void Generate(ClassEmitter @class, ProxyGenerationOptions options)
{
GenerateCallProperty(@class.TypeBuilder);
}
protected virtual void GenerateCallProperty(TypeBuilder typeBuilder)
{
var fieldBuilder = typeBuilder.DefineField(
"_call",
typeof(MethodCallCommand),
FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty(
"Call",
PropertyAttributes.None,
typeof(MethodCallCommand),
Type.EmptyTypes);
var getterBuilder = typeBuilder.DefineMethod(
"get_Call",
MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
typeof(MethodCallCommand),
Type.EmptyTypes);
var generator = getterBuilder.GetILGenerator();
Label returnStatement = generator.DefineLabel();
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, fieldBuilder);
generator.Emit(OpCodes.Ldnull);
generator.Emit(OpCodes.Ceq);
generator.Emit(OpCodes.Brfalse, returnStatement);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Newobj, typeof(MethodCallCommand).GetConstructor(new Type[] { typeof(PresentationModel) }));
generator.Emit(OpCodes.Stfld, fieldBuilder);
generator.MarkLabel(returnStatement);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, fieldBuilder);
generator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getterBuilder);
}
}
}
|
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.