- 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.Emitters;
using Castle.DynamicProxy.Generators;
namespace Castle.Facilities.PresentationModelIntegration
{
public class NotificatingPropertyTypeContributor : ITypeContributor
{
public NotificatingPropertyTypeContributor(string propertyName, Type propertyType)
{
_propertyName = propertyName;
_propertyType = propertyType;
}
string _propertyName;
Type _propertyType;
public void CollectElementsToProxy(IProxyGenerationHook hook, MetaType model)
{
}
public void Generate(ClassEmitter @class, ProxyGenerationOptions options)
{
GenerateSimpleProperty(@class.TypeBuilder);
}
protected virtual void GenerateSimpleProperty(TypeBuilder typeBuilder)
{
var fieldBuilder = typeBuilder.DefineField(
string.Format("_{0}", _propertyName),
_propertyType,
FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty(
_propertyName,
PropertyAttributes.None,
_propertyType,
Type.EmptyTypes);
var getterBuilder = typeBuilder.DefineMethod(
string.Format("get_{0}", _propertyName),
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
_propertyType,
Type.EmptyTypes);
var getterGenerator = getterBuilder.GetILGenerator();
getterGenerator.Emit(OpCodes.Ldarg_0);
getterGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
getterGenerator.Emit(OpCodes.Ret);
var setterBuilder = typeBuilder.DefineMethod(
string.Format("set_{0}", _propertyName),
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
null,
new Type[] { _propertyType });
var setterGenerator = setterBuilder.GetILGenerator();
Label returnInstruction = setterGenerator.DefineLabel();
setterGenerator.Emit(OpCodes.Ldarg_0);
setterGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
setterGenerator.Emit(OpCodes.Ldarg_1);
setterGenerator.Emit(OpCodes.Ceq);
setterGenerator.Emit(OpCodes.Brtrue, returnInstruction);
setterGenerator.Emit(OpCodes.Ldarg_0);
setterGenerator.Emit(OpCodes.Ldarg_1);
setterGenerator.Emit(OpCodes.Stfld, fieldBuilder);
setterGenerator.Emit(OpCodes.Ldarg_0);
setterGenerator.Emit(OpCodes.Ldstr, _propertyName);
setterGenerator.Emit(OpCodes.Callvirt, typeBuilder.BaseType.GetMethod("OnPropertyChanged", BindingFlags.NonPublic | BindingFlags.Instance));
setterGenerator.MarkLabel(returnInstruction);
setterGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getterBuilder);
propertyBuilder.SetSetMethod(setterBuilder);
}
}
}
|
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.